23

可能重复:
SQL Server 查询以查找所有当前数据库名称

我试图弄清楚如何在连接到服务器后列出数据库而不先指定数据库。

sqlConnection1 = new SqlConnection("Server=" + sqlServer + ";Database=" + database +    
";User ID=" + userName + ";Password=" + password + ";Trusted_Connection=False;");

所以基本上我想要的是最终用户连接到 sql 服务器,然后有一个下拉列表填充了他们可以连接和查询的 db 列表。

想法?

4

6 回答 6

43

您可以使用SqlConnection.GetSchema

using(var con = new SqlConnection("Data Source=Yourserver; Integrated Security=True;"))
{
    con.Open();
    DataTable databases = con.GetSchema("Databases");
    foreach (DataRow database in databases.Rows)
    {
        String databaseName = database.Field<String>("database_name");
        short dbID = database.Field<short>("dbid");
        DateTime creationDate = database.Field<DateTime>("create_date");
    }
} 

SQL Server 架构集合 (ADO.NET)

要确定支持的架构集合列表,请调用不带参数的 GetSchema 方法,或使用架构集合名称“MetaDataCollections”。这将返回一个 DataTable,其中包含受支持的架构集合的列表、它们各自支持的限制数量以及它们使用的标识符部分的数量。

于 2012-10-12T15:47:21.150 回答
5

您可以编写一个存储过程,它可以返回该服务器上的数据库列表。

SELECT name
FROM master.sys.databases

或者

EXEC sp_databases
于 2012-10-12T15:44:16.937 回答
3

这应该为您提供数据库名称:

var connectionString = string.Format("Data Source=localhost;User ID={0};Password={1};", userName, password);

DataTable databases = null;
using (var sqlConnection = new SqlConnection(connectionString))
{
    sqlConnection.Open();
    databases = sqlConnection.GetSchema("Databases");
    sqlConnection.Close();
}

if (databases != null)
{
    foreach (DataRow row in databases.Rows)
    {
        foreach (var item in row.ItemArray)
        {
            Console.Write("{0} ", item);
        }
        Console.WriteLine();
    }
}

最后请随意排除所有打印。将所有这些都扔到控制台应用程序中以查看它的实际效果。表名位于 的索引 0 中row.ItemArray

于 2012-10-12T15:51:43.980 回答
2

您可以使用 SMO- SQL Server 管理对象

这是代码项目中的两个示例代码:

使用 SMO 的 SQL Server 身份验证

使用 SMO 的数据库

于 2012-10-12T15:47:55.497 回答
1

最新的数据库列表将在数据库本身中。为什么不连接到tempdb默认数据库(因为您必须连接到某些东西)开始,然后从 master.sys.databases 查询。

select [name] from master.sys.databases

然后,您可以使用任何必要的数据库更新连接字符串,或者使用该ChangeDatabase()方法简单地更改数据库。

例如connection.ChangeDatabase(selectedDB);

您也可以连接到 master,但我喜欢在 tempdb 中保留默认连接,因为有时人们会在创建对象之前忘记更改数据库。我宁愿垃圾进入 tempdb 而不是 master,因为在 SQL 重新启动时会重新创建 tempdb。

于 2012-10-12T15:44:48.280 回答
0

你可以试试

select * from master.sys.databases
于 2012-10-12T15:45:21.043 回答