--try--得到局域网内sqlserver的数据库及实例名 public string[] GetServers() { string[] serverNames = null; SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance; System.Data.DataTable table = instance.GetDataSources(); if (table.Rows.Count <= 0) return null; serverNames = new string[table.Rows.Count]; int i = 0; foreach (System.Data.DataRow row in table.Rows) { if (row["InstanceName"].ToString().Length > 0) serverNames[i] = row["ServerName"].ToString() + "\\" + row["InstanceName"].ToString(); else serverNames[i] = row["ServerName"].ToString(); i++; } return serverNames; }
--转: 使用SQLDMO和T-SQL列出所有的实例--王成辉翻译整理,转贴请注明出自微软BI开拓者www.windbi.com --原帖地址 微软报告的Bug: SQLDMO.Application对象的方法ListAvailableServers会引起0x800A000E错误。 当从ASP页面执行SQLDMO.Application对象的方法ListAvailableServers,也许会发生下面的错误消息:Microsoft SQL-DMO (0x800A000E) [SQL-DMO]Not enough storage is available to complete this operation. 然而,有一些方法可以解决这个问题以得到实例即在ASP上使用客户端脚本。这里有一个存储过程,我们将准备列出所有可用的实例,所以在你的Web应用程序里很容易展示它们。CREATE PROCEDURE EnumerateSQLServers AS /* 存储过程名称: EnumerateSQLServers 作者 : Srdjan Josipovic 日期 : 2002-06-19 目的 :使用SQLDMO和TSQL列出所有可用的实例 翻译整理 :王成辉*/DECLARE @retval int DECLARE @result varchar(500) DECLARE @object int DECLARE @objectList int DECLARE @src varchar(254) DECLARE @desc varchar(255) DECLARE @resultsCount int DECLARE @counter int DECLARE @method varchar(255)--创建SQLDMO对象 EXEC @retval = sp_OACreate 'SQLDMO.Application', @object OUT--检查对象是否创建成功 IF @retval <> 0 BEGIN EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc RETURN END --调用方法ListAvailableServers() , 为SQLDMO.NameList得到Object_ID EXEC @retval = sp_OAMethod @object , 'ListAvailableSQlServers()' , @objectList OUT -- 是否有错误? IF @retval <> 0 BEGIN EXEC sp_OAGetErrorInfo @objectList, @src OUT, @desc OUT SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc RETURN END --计算局域网里的服务器数量 EXEC @retval = sp_OAGetProperty @objectList , 'Count' , @resultsCount OUT --再一次进行错误处理 IF @retval <> 0 BEGIN EXEC sp_OAGetErrorInfo @objectList, @src OUT, @desc OUT SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc RETURN END--如果有服务器的话,进入处理..... IF @resultsCount > 0 BEGIN SET @counter = 1 DECLARE @ServersTbl table (ServerID int IDENTITY ,ServerName varchar(255)) WHILE @counter <= @resultsCount BEGIN --列出SQL实例:一个名字接一个名字的列出 SET @method = 'Item(' + convert(varchar(3),@counter) + ')' EXEC @retval = sp_OAGetProperty @objectList ,@method , @result OUT
--将数据存到临时表 INSERT INTO @ServersTbl (ServerName) SELECT @result
--移到下一条记录 SET @counter = @counter + 1 END END ELSE BEGIN SET @result = 'No Servers around you' INSERT INTO @ServersTbl (ServerName) SELECT @result END --释放对象 EXEC @retval = sp_OADestroy @object IF @retval <> 0 BEGIN EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc RETURN END--好了,可以列出所有可用的实例了 .... SELECT * FROM @ServersTbl GO
public string[] GetServers()
{
string[] serverNames = null;
SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance;
System.Data.DataTable table = instance.GetDataSources();
if (table.Rows.Count <= 0)
return null;
serverNames = new string[table.Rows.Count];
int i = 0;
foreach (System.Data.DataRow row in table.Rows)
{
if (row["InstanceName"].ToString().Length > 0)
serverNames[i] = row["ServerName"].ToString() + "\\" + row["InstanceName"].ToString();
else
serverNames[i] = row["ServerName"].ToString(); i++;
}
return serverNames;
}
使用SQLDMO和T-SQL列出所有的实例--王成辉翻译整理,转贴请注明出自微软BI开拓者www.windbi.com
--原帖地址
微软报告的Bug:
SQLDMO.Application对象的方法ListAvailableServers会引起0x800A000E错误。
当从ASP页面执行SQLDMO.Application对象的方法ListAvailableServers,也许会发生下面的错误消息:Microsoft SQL-DMO (0x800A000E)
[SQL-DMO]Not enough storage is available to complete this operation. 然而,有一些方法可以解决这个问题以得到实例即在ASP上使用客户端脚本。这里有一个存储过程,我们将准备列出所有可用的实例,所以在你的Web应用程序里很容易展示它们。CREATE PROCEDURE EnumerateSQLServers
AS
/*
存储过程名称: EnumerateSQLServers
作者 : Srdjan Josipovic
日期 : 2002-06-19
目的 :使用SQLDMO和TSQL列出所有可用的实例
翻译整理 :王成辉*/DECLARE @retval int
DECLARE @result varchar(500)
DECLARE @object int
DECLARE @objectList int
DECLARE @src varchar(254)
DECLARE @desc varchar(255)
DECLARE @resultsCount int
DECLARE @counter int
DECLARE @method varchar(255)--创建SQLDMO对象
EXEC @retval = sp_OACreate 'SQLDMO.Application', @object OUT--检查对象是否创建成功
IF @retval <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc
RETURN
END
--调用方法ListAvailableServers() , 为SQLDMO.NameList得到Object_ID
EXEC @retval = sp_OAMethod @object , 'ListAvailableSQlServers()' , @objectList OUT
-- 是否有错误?
IF @retval <> 0
BEGIN
EXEC sp_OAGetErrorInfo @objectList, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc
RETURN
END
--计算局域网里的服务器数量
EXEC @retval = sp_OAGetProperty @objectList , 'Count' , @resultsCount OUT
--再一次进行错误处理
IF @retval <> 0
BEGIN
EXEC sp_OAGetErrorInfo @objectList, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc
RETURN
END--如果有服务器的话,进入处理.....
IF @resultsCount > 0
BEGIN
SET @counter = 1
DECLARE @ServersTbl table (ServerID int IDENTITY ,ServerName varchar(255))
WHILE @counter <= @resultsCount
BEGIN
--列出SQL实例:一个名字接一个名字的列出
SET @method = 'Item(' + convert(varchar(3),@counter) + ')'
EXEC @retval = sp_OAGetProperty @objectList ,@method , @result OUT
--将数据存到临时表
INSERT INTO @ServersTbl (ServerName) SELECT @result
--移到下一条记录
SET @counter = @counter + 1
END
END
ELSE
BEGIN
SET @result = 'No Servers around you'
INSERT INTO @ServersTbl (ServerName) SELECT @result
END
--释放对象
EXEC @retval = sp_OADestroy @object
IF @retval <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc
RETURN
END--好了,可以列出所有可用的实例了 ....
SELECT * FROM @ServersTbl
GO