以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  Finding SQL Servers on the Network  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=11804)


--  作者:admin
--  发布时间:11/9/2004 2:26:00 AM

--  Finding SQL Servers on the Network


发信人: Nineteen (-_-#!), 信区: DotNET
标  题: Finding SQL Servers on the Network
发信站: BBS 水木清华站 (Wed Dec 31 16:13:03 2003), 转信

//by Michael Potter
//happy new year,everyone.


using System;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;


namespace DBGrep
{
        public class SqlLocator
        {
                [DllImport("odbc32.dll")]
                private static extern short SQLAllocHandle(short hType, IntPtr inputHandle, out IntPtr outputHandle);
                [DllImport("odbc32.dll")]
                private static extern short SQLSetEnvAttr(IntPtr henv, int attribute, IntPtr valuePtr, int strLength);
                [DllImport("odbc32.dll")]
                private static extern short SQLFreeHandle(short hType, IntPtr handle);  
                [DllImport("odbc32.dll",CharSet=CharSet.Ansi)]
                private static extern short SQLBrowseConnect(IntPtr hconn, StringBuilder inString,  
                        short inStringLength, StringBuilder outString, short outStringLength,
                        out short outLengthNeeded);

                private const short SQL_HANDLE_ENV = 1;
                private const short SQL_HANDLE_DBC = 2;
                private const int SQL_ATTR_ODBC_VERSION = 200;
                private const int SQL_OV_ODBC3 = 3;
                private const short SQL_SUCCESS = 0;
                 
                private const short SQL_NEED_DATA = 99;
                private const short DEFAULT_RESULT_SIZE = 1024;
                private const string SQL_DRIVER_STR = "DRIVER=SQL SERVER";
         
                private SqlLocator(){}

                public static string[] GetServers()
                {
                        string[] retval = null;
                        string txt = string.Empty;
                        IntPtr henv = IntPtr.Zero;
                        IntPtr hconn = IntPtr.Zero;
                        StringBuilder inString = new StringBuilder(SQL_DRIVER_STR);
                        StringBuilder outString = new StringBuilder(DEFAULT_RESULT_SIZE);
                        short inStringLength = (short) inString.Length;
                        short lenNeeded = 0;

                        try
                        {
                                if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_ENV, henv, out henv))
                                {
                                        if (SQL_SUCCESS == SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(IntPtr)SQL_OV_ODBC3,0))
                                        {
                                                if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_DBC, henv, out hconn))
                                                {
                                                        if (SQL_NEED_DATA ==  SQLBrowseConnect(hconn, inString, inStringLength, outString,  
                                                                DEFAULT_RESULT_SIZE, out lenNeeded))
                                                        {
                                                                if (DEFAULT_RESULT_SIZE < lenNeeded)
                                                                {
                                                                        outString.Capacity = lenNeeded;
                                                                        if (SQL_NEED_DATA != SQLBrowseConnect(hconn, inString, inStringLength, outString,  
                                                                                lenNeeded,out lenNeeded))
                                                                        {
                                                                                throw new ApplicationException("Unabled to aquire SQL Servers from ODBC driver.");
                                                                        }        
                                                                }
                                                                txt = outString.ToString();
                                                                int start = txt.IndexOf("{") + 1;
                                                                int len = txt.IndexOf("}") - start;
                                                                if ((start > 0) && (len > 0))
                                                                {
                                                                        txt = txt.Substring(start,len);
                                                                }
                                                                else
                                                                {
                                                                        txt = string.Empty;
                                                                }
                                                        }                                                
                                                }
                                        }
                                }
                        }
                        catch (Exception ex)
                        {
                                //Throw away any error if we are not in debug mode
#if (DEBUG)
                                MessageBox.Show(ex.Message,"Acquire SQL Servier List Error");
#endif  
                                txt = string.Empty;
                        }
                        finally
                        {
                                if (hconn != IntPtr.Zero)
                                {
                                        SQLFreeHandle(SQL_HANDLE_DBC,hconn);
                                }
                                if (henv != IntPtr.Zero)
                                {
                                        SQLFreeHandle(SQL_HANDLE_ENV,hconn);
                                }
                        }
         
                        if (txt.Length > 0)
                        {
                                retval = txt.Split(",".ToCharArray());
                        }

                        return retval;
                }
        }
}
--
——长夜漫漫,无心睡眠……难道狼妹妹也睡不着吗?


※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.206.3.*]
上一篇
返回上一页
回到目录
回到页首



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
74.219ms