如何自动检查内网的SQL服务器?
小弟想做个自动检测内网SQL服务器的小程序.
像SQL SERVER企业管理器那样的
新建SQL SERVER注册 ,然后在 可用的服务器 下面会列出当前网内的所有的SQL 服务器 .
怎么实现呢?
请教
[解决办法]
获取局域网内所有SqlServer
*-----------------------------------------------
* 函数: 获取局域网内所有SqlServer
* 设计: 红雨
* 时间: 2005.04.01
*-----------------------------------------------
Function NetEnumSqlServer( tcTableName )
m.tcTableName = Iif(Type([m.tcTableName])=[C], m.tcTableName, [TNetEnumSqlServer])
Create Cursor (m.tcTableName) ( ServerName C(254) )
Declare SHORT SQLBrowseConnect In odbc32 Integer ConnectionHandle, String InConnectionString, Integer StringLength1, String @ OutConnectionString, Integer BufferLength, Integer @ StringLength2Ptr
Declare SHORT SQLAllocHandle In odbc32 Integer HandleType, Integer InputHandle, Integer @ OutputHandlePtr
Declare SHORT SQLFreeHandle In odbc32 Integer HandleType, Integer Handle
Declare SHORT SQLSetEnvAttr In odbc32 Integer EnvironmentHandle, Integer Attribute, Integer ValuePtr, Integer StringLength
Local hEnv, hConn, cInString, cOutString, nLenOutString, nCnt, iCnt
m.nCnt = 0
m.hEnv = 0
m.hConn = 0
m.cInString = "DRIVER=SQL SERVER"
m.cOutString = Space(2048)
m.nLenOutString = 0
Local Array aServerList[1]
If SQLAllocHandle(1, 0, @hEnv) = 0
If SQLSetEnvAttr(m.hEnv, 200, 3, 0) = 0
If SQLAllocHandle(2, m.hEnv, @hConn) = 0
If SQLBrowseConnect(m.hConn, @cInString, Len(m.cInString), @cOutString, 2048, @nLenOutString) = 99
m.nCnt = Alines(aServerList, Strextract(m.cOutString, '{', '}'), .T., ',')
For m.iCnt = 1 To m.nCnt
Insert Into (m.tcTableName) Values ( aServerList[iCnt] )
Endfor
Endif
Endif
Endif
Endif
Endfunc
无意中找到了以前的一个C#程序,觉得好用发到这里以便和大家共享一下,其实这个代码我是抄别人过来的,原作者不详,觉得写的好就和大家共享一下了程序实现了用API来得到SqlServer服务器列表的功能,我觉得比用SQLDEMO组件更有意义,代码如下:/// <summary>/// 获取网内的数据库服务器名称/// </summary>public class SqlLocator{ [System.Runtime.InteropServices.DllImport("odbc32.dll")] private static extern short SQLAllocHandle(short hType, IntPtr inputHandle, 'B'
[解决办法]
没试过,
看看!:)
-----------------
先装一个最新的SP2包,确保SQLDMO.dll是最新的。然后在C#中引用SqlDMO.dll,以下方法将局域网内的可用的SQL server列出到组合框中。
public long listSqlservers(ComboBox servers) { SQLDMO.Application sql = new SQLDMO.Application(); SQLDMO.NameList mynamelist = sql.Application.ListAvailableSQLServers(); long lCount = mynamelist.Count; for (int i=1; i < lCount + 1; i++) { string str = mynamelist.Item (i); if (str != null) if (servers.FindString (str) == -1) { servers.Items.Add (str); } } return lCount; }
[解决办法]
Public Shared Function GetServerSource() As DataTable Dim mySQL As Sql.SqlDataSourceEnumerator = Sql.SqlDataSourceEnumerator.Instance Return mySQL.GetDataSources End Function
[解决办法]
引用DMO就行..
不要告诉我..这个代码..你不会改写成VB.Net
引用SQLDMO (COM组件)包含两个基本对象Application、SQLServer(先实例化)Application属性/方法NameList 保存服务器清单的集合ListAllAvailableServers 取得网络上可用服务器的方法SQLServer属性/方法Connect 连接SQLServer以便访问数据库LoginSecure 指定用可信任连接连接SQLServerDatabases 指定SQLServer的数据库集合程序段示例int i;SQLDMO.NameList oNames = new SQLDMO.NameList();SQLDMO.Application oSQLApp= new SQLDMO.Application();oNames=oSQLApp.ListAvailableSQLServers();if (oNames.Count==0){ Listbox1.Items.Add("(local)");}for (i=1;i=oNames.Count;i++){ Listbox1.Items.Add(oNames.Item(i));}===============================Object db;SQLDMO.SQLServer osvr=new SQLDMO.SQLServer();osvr.LoginSecure=true;osvr.Connect(strSQLServer);//这个字符串就是上面的listitemforeach (db in osvr.Databases){ Listbox2.Items.Add(db.Name);}