我试图找出如何在连接到服务器之后列出数据库而不先指定数据库。
sqlConnection1 = new SqlConnection("Server=" + sqlServer + ";Database=" + database +
";User ID=" + userName + ";Password=" + password + ";Trusted_Connection=False;");
基本上我想要的是最终用户连接到sql server,然后有一个下拉列表,其中填充了他们可以连接和查询的db列表。
想法?
答案 0 :(得分:42)
您可以使用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 Schema Collections (ADO.NET)
要确定支持的架构集合列表,请调用 没有参数的GetSchema方法,或者使用模式集合名称 “MetaDataCollections”。这将返回一个带有列表的DataTable 支持的模式集合,它们的限制数量 每个支持,以及它们使用的标识符部分的数量。
答案 1 :(得分:5)
您可以编写一个存储过程,它可以返回该服务器上的数据库列表。
SELECT name
FROM master.sys.databases
或
EXEC sp_databases
答案 2 :(得分: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();
}
}
最后排除所有打印。在控制台应用程序中抛出所有内容以查看它的运行情况。表名在row.ItemArray
的索引0中。
答案 3 :(得分:2)
答案 4 :(得分:1)
最新的数据库列表将在数据库中。为什么不连接到tempdb
作为默认数据库(因为你必须连接到某些东西)开始,然后从master.sys.databases查询。
select [name] from master.sys.databases
然后,您可以使用所需的任何数据库更新连接字符串,或者只需使用ChangeDatabase()
方法更改数据库。
e.g。 connection.ChangeDatabase(selectedDB);
您也可以连接到master,但我喜欢在tempdb中保留默认连接,因为有时人们忘记在创建对象之前更改数据库。我宁愿垃圾进入tempdb而不是master,因为当SQL重新启动时会重新创建tempdb。
答案 5 :(得分:0)
您可以尝试使用
select * from master.sys.databases