C# 获取局域网所有数据库服务器名称

代码
 
   
C# 获取局域网所有数据库服务器名称2009年05月14日 星期四 14 :10 using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace Barcode.DBConfig
{
/// <summary>
/// 获取网内的数据库服务器名称
/// </summary>
public class SqlLocator
{
#region 供使用API方式时使用
[System.Runtime.InteropServices.DllImport(
" odbc32.dll " )]
private static extern short SQLAllocHandle( short hType, IntPtr inputHandle, out IntPtr outputHandle);

[System.Runtime.InteropServices.DllImport(
" odbc32.dll " )]
private static extern short SQLSetEnvAttr(IntPtr henv, int attribute, IntPtr valuePtr, int strLength);

[System.Runtime.InteropServices.DllImport(
" odbc32.dll " )]
private static extern short SQLFreeHandle( short hType, IntPtr handle);

[System.Runtime.InteropServices.DllImport(
" odbc32.dll " , CharSet = System.Runtime.InteropServices.CharSet.Ansi)]

private static extern short SQLBrowseConnect(IntPtr hconn, System.Text.StringBuilder inString,
short inStringLength, System.Text.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 " ;

#endregion

/// <summary>
/// 禁止实例化
/// </summary>
private SqlLocator() { }

/// <summary>
/// 获取网内的数据库服务器名称
/// </summary>
/// <returns> 服务器名称数组 </returns>
public static string [] GetLocalSqlServerNamesWithAPI()
{
string list = string .Empty;
IntPtr henv
= IntPtr.Zero;
IntPtr hconn
= IntPtr.Zero;
System.Text.StringBuilder inString
= new System.Text.StringBuilder(SQL_DRIVER_STR);
System.Text.StringBuilder outString
= new System.Text.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. " );
}
}
list
= outString.ToString();
int start = list.IndexOf( " { " ) + 1 ;
int len = list.IndexOf( " } " ) - start;
if ((start > 0 ) && (len > 0 ))
{
list
= list.Substring(start, len);
}
else
{
list
= string .Empty;
}
}
}
}
}
}
catch
{
list
= string .Empty;
}

finally
{
if (hconn != IntPtr.Zero)
{
SQLFreeHandle(SQL_HANDLE_DBC, hconn);
}

if (henv != IntPtr.Zero)
{
SQLFreeHandle(SQL_HANDLE_ENV, hconn);
}
}

string [] array = null ;

if (list.Length > 0 )
{

array
= list.Split( ' , ' );

}
return array;
}

/// <summary>
/// 获取局域网内的所有数据库服务器名称
/// </summary>
/// <returns> 服务器名称数组 </returns>
public static string [] GetLocalSqlServerNamesWithSqlClientFactory()
{
DataTable dataSources
= SqlClientFactory.Instance.CreateDataSourceEnumerator().GetDataSources();
DataColumn column2
= dataSources.Columns[ " ServerName " ];
DataColumn column
= dataSources.Columns[ " InstanceName " ];
DataRowCollection rows
= dataSources.Rows;
string [] array = new string [rows.Count];
for ( int i = 0 ; i < array.Length; i ++ )
{
string str2 = rows[i][column2] as string ;
string str = rows[i][column] as string ;
if (((str == null ) || (str.Length == 0 )) || ( " MSSQLSERVER " == str))
{
array[i]
= str2;
}
else
{
array[i]
= str2 + @" \ " + str;
}
}
Array.Sort
< string > (array);

return array;
}
}
}


// 注意:经测试,使用API方式速度能快一点!
在网上还有使用SQLDMO的方法,好像只有安装了SQLServer才会有这个DLL的!
推荐使用上面介绍的第二种方式!

 

转载于:https://www.cnblogs.com/JoshuaDreaming/archive/2010/11/25/1887991.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值