c# 获取当前可见的sqlserver 服务以及数据库
根据提供的标题、描述、标签及部分内容,我们可以了解到这段代码主要涉及使用C#语言来获取当前可见的SQL Server服务以及数据库。接下来将详细解释这一过程中的关键知识点。 ### 一、SQLDMO(SQL Server Desktop Metadata Object Model) #### 1.1 SQLDMO简介 SQLDMO 是一个用于管理 SQL Server 数据库对象的 COM 组件库,它提供了丰富的 API 来操作 SQL Server 的各个组件。在早期版本的 SQL Server 中广泛使用,但在较新的版本中已被逐渐替代。尽管如此,在某些情况下,仍然可以使用 SQLDMO 来完成一些任务。 #### 1.2 使用SQLDMO获取SQL Server列表 ```csharp // 获取所有可用的 SQL Server 实例 List<string> servers = new List<string>(); SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass(); SQLDMO.NameList sqlServers = sqlApp.ListAvailableSQLServers(); for (int i = 1; i < sqlServers.Count; i++) { object srv = sqlServers.Item(i); if (srv != null) { servers.Add(srv.ToString()); } } ``` 此段代码通过 `SQLDMO.Application` 类创建了一个应用程序对象,并调用 `ListAvailableSQLServers` 方法来获取当前计算机上所有可见的 SQL Server 服务实例。之后遍历这些实例,并将其名称添加到 `servers` 列表中。 ### 二、获取数据库列表 在获取了所有可见的 SQL Server 服务后,接下来需要获取每个服务下的数据库列表。 #### 2.1 连接到SQL Server并获取数据库 ```csharp List<string> databases = new List<string>(); foreach (string everyServer in servers) { SQLDMO.SQLServer serv = new SQLDMO.SQLServerClass(); serv.Connect(everyServer, "sa", "123"); // 连接到指定的 SQL Server 并使用默认凭据 foreach (SQLDMO.Database db in serv.Databases) { if (db.Name != null) databases.Add(db.Name); } } ``` 这里首先为每一个服务器创建一个 `SQLDMO.SQLServer` 对象,并使用默认的用户名 `sa` 和密码 `123` 进行连接。然后,遍历该服务器的所有数据库,并将数据库名加入到 `databases` 列表中。 ### 三、获取存储过程列表 除了获取数据库列表之外,还展示了如何获取特定数据库中的存储过程列表。 ```csharp // 连接到指定的 SQL Server SQLDMO.SQLServer srv = new SQLDMO.SQLServerClass(); srv.Connect(cboServers.SelectedItem.ToString(), txtUser.Text, txtPassword.Text); for (int i = 0; i < srv.Databases.Count; i++) { if (srv.Databases.Item(i + 1, "dbo").Name == cboDatabase.SelectedItem.ToString()) { SQLDMO._Database db = srv.Databases.Item(i + 1, "dbo"); lstObjects.Items.Clear(); for (int j = 0; j < db.StoredProcedures.Count; j++) { lstObjects.Items.Add(db.StoredProcedures.Item(j + 1, "dbo").Name); } break; } } ``` 该代码片段通过连接到指定的 SQL Server 实例,然后获取所选数据库中的所有存储过程,并将它们的名字显示在一个列表框中。 ### 四、使用Windows API获取SQL Server实例 提供了一段使用 Windows API 的代码示例来获取 SQL Server 实例列表。这通常在没有安装 SQL Server 客户端工具时使用。 ```csharp public class SqlLocator { [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; // 以下代码用于实际调用 public static List<string> GetSqlServers() { List<string> servers = new List<string>(); IntPtr henv = IntPtr.Zero; IntPtr hdbc = IntPtr.Zero; IntPtr hstmt = IntPtr.Zero; // 分配环境句柄 short retCode = SQLAllocHandle(SQL_HANDLE_ENV, IntPtr.Zero, out henv); if (retCode != 0) return servers; // 设置属性 retCode = SQLSetEnvAttr(henv, 100, IntPtr.Zero, 0); if (retCode != 0) return servers; // 分配连接句柄 retCode = SQLAllocHandle(2, henv, out hdbc); if (retCode != 0) return servers; // 浏览连接 System.Text.StringBuilder inStr = new System.Text.StringBuilder("Driver={SQL Server};"); System.Text.StringBuilder outStr = new System.Text.StringBuilder(256); short needed = 0; retCode = SQLBrowseConnect(hdbc, inStr, (short)inStr.Length, outStr, (short)outStr.Capacity, out needed); if (retCode != 0) return servers; // 处理返回的字符串 string[] serverNames = outStr.ToString().Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); foreach (var serverName in serverNames) { servers.Add(serverName.Trim()); } // 释放资源 SQLFreeHandle(2, hdbc); SQLFreeHandle(1, henv); return servers; } } ``` 这段代码使用了 ODBC API 来分配环境句柄、设置环境属性、分配连接句柄,并最终调用 `SQLBrowseConnect` 函数来获取 SQL Server 实例列表。通过解析返回的字符串,可以得到每个服务器的名称,并将其添加到 `servers` 列表中。 以上就是基于所提供的文件信息所整理出的关键知识点,包括使用 SQLDMO 和 Windows API 来获取 SQL Server 服务及其数据库的具体方法。这些知识点对于开发者来说非常有用,可以帮助他们更高效地进行数据库管理和查询工作。
2. 添加如下代码:
//get all available SQL Servers
List<string> server = new List<string>();
SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass();
SQLDMO.NameList sqlServers = sqlApp.ListAvailableSQLServers();
for (int i = 1; i < sqlServers.Count; i++)
{
object srv = sqlServers.Item(i);
if (srv != null)
{
server.Add(srv.ToString());
}
}
List<string> Database = new List<string>();
foreach (string everyServer in server)
{
SQLDMO.SQLServer serv = new SQLDMO.SQLServerClass();
serv.Connect(everyServer, "sa", "123");
//get all available databases from an SQL Server
foreach (SQLDMO.Database db in serv.Databases)
{
if (db.Name != null)
Database.Add(db.Name);
}
//Get all Stored procedures - tables are in the Tables collection, views are in the Views collection
SQLDMO.SQLServer srv = new SQLDMO.SQLServerClass();
srv.Connect(this.cboServers.SelectedItem.ToString(),this.txtUser.Text,this.txtPassword.Text);
for(int i=0;i<srv.Databases.Count;i++)
{
if(srv.Databases.Item(i+1,"dbo").Name == this.cboDatabase.SelectedItem.ToString())
{
SQLDMO._Database db= srv.Databases.Item(i+1,"dbo");
this.lstObjects.Items.Clear();
for(int j=0;j<db.StoredProcedures.Count;j++)
{
this.lstObjects.Items.Add(db.StoredProcedures.Item(j+1,"dbo").Name);
}
break;
}
以下是调用windows的api获取sql服务名称的方法:
/// <summary>
/// 获取网内的数据库服务器名称
/// </summary>
public class SqlLocator
{
剩余8页未读,继续阅读
- binyiwang2013-11-11有一定的参考价值。
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助