【问题标题】:C# connect to database and list the databases [duplicate]C#连接到数据库并列出数据库[重复]
【发布时间】:2012-10-03 11:28:08
【问题描述】:

可能重复:
SQL Server query to find all current database names

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

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

所以基本上我想要的是最终用户连接到 sql 服务器,然后在下拉列表中填充他们可以连接和查询的数据库列表。

想法?

【问题讨论】:

    标签: c# sql database ado.net sqlconnection


    【解决方案1】:

    你可以使用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 方法 “元数据集合”。这将返回一个带有列表的 DataTable 支持的模式集合,它们的限制数量 每个支撑,以及它们使用的标识符部分的数量。

    【讨论】:

    • 当然sqlConnection.Open(); 应该被包裹在try{} catch(Exception e){} 中,以防登录失败/超时等情况。
    • @Dannybecket:您不应该使用空的 catch 来处理连接问题。然后最好让异常冒泡到全局处理程序。因为它不是这个问题的一部分,所以我没有展示它。
    • 一个空的捕获不是想法,我只是指出你应该检查异常。
    【解决方案2】:

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

    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 中。

    【讨论】:

    • 当然sqlConnection.Open(); 应该被包裹在try{} catch(Exception e){} 中,以防登录/超时等错误。
    • 您不需要手动关闭连接,因为您将其包装在 using 语句中。
    【解决方案3】:

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

    select [name] from master.sys.databases

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

    例如connection.ChangeDatabase(selectedDB);

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

    【讨论】:

      【解决方案4】:

      您可以使用 SMO - SQL Server Management Objects

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

      SQL Server Authentication using SMO

      Databases using SMO

      【讨论】:

        【解决方案5】:

        你可以试试

        select * from master.sys.databases
        

        【讨论】:

          【解决方案6】:

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

          SELECT name
          FROM master.sys.databases
          

          EXEC sp_databases
          

          【讨论】:

          • 或者直接连接master数据库,通过代码查询——假设连接字符串中的SQL Login有足够的权限访问master。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-10
          • 1970-01-01
          • 1970-01-01
          • 2016-08-14
          • 2015-07-02
          • 2016-01-23
          • 2018-02-19
          相关资源
          最近更新 更多