获取Sql服务器列表 (C#)
生活随笔
收集整理的這篇文章主要介紹了
获取Sql服务器列表 (C#)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
private?void?button1_Click_1(object?sender,?System.EventArgs?e)
{
?string[]?servers?=?DBGrep.SqlLocator.GetServers();
?foreach?(?string?s?in?servers?)
{
?this.listBox1.Items.Add(s);
}
}
類的代碼
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;
}
}
}
{
?string[]?servers?=?DBGrep.SqlLocator.GetServers();
?foreach?(?string?s?in?servers?)
{
?this.listBox1.Items.Add(s);
}
}
類的代碼
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;
}
}
}
總結
以上是生活随笔為你收集整理的获取Sql服务器列表 (C#)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 删除Windows服务[转载]
- 下一篇: C#模拟MSN窗体抖动[原创]