Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C连接到数据库并列出数据库_C#_Sql_Database_Ado.net_Sqlconnection - Fatal编程技术网

C# C连接到数据库并列出数据库

C# C连接到数据库并列出数据库,c#,sql,database,ado.net,sqlconnection,C#,Sql,Database,Ado.net,Sqlconnection,可能重复: 我试图弄清楚在连接到服务器后如何列出数据库,而不首先指定数据库 sqlConnection1 = new SqlConnection("Server=" + sqlServer + ";Database=" + database + ";User ID=" + userName + ";Password=" + password + ";Trusted_Connection=False;"); 因此,基本上我想要的是最终用户连接到sql server,然后用下拉列表填充他

可能重复:

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

sqlConnection1 = new SqlConnection("Server=" + sqlServer + ";Database=" + database +    
";User ID=" + userName + ";Password=" + password + ";Trusted_Connection=False;");
因此,基本上我想要的是最终用户连接到sql server,然后用下拉列表填充他们可以连接和查询的数据库列表


想法?

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

SELECT name
FROM master.sys.databases


数据库的最新列表将在数据库本身中。为什么不作为默认数据库连接到tempdb,因为您必须先连接到要启动的数据库,然后从master.sys.databases进行查询

从master.sys.databases中选择[name]

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

e、 g.connection.ChangeDatabaseselectedDB

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

你可以试试看

select * from master.sys.databases
您可以使用:

要确定支持的架构集合的列表,请调用 不带参数或具有架构集合名称的GetSchema方法 元数据集合。这将返回一个DataTable,其中包含 支持的架构集合,它们所支持的限制数 每个支持,以及它们使用的标识符部分的数量

您可以使用SMO-

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


这将为您提供数据库名称:

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中,或者直接连接到主数据库并通过代码查询-假设连接字符串中的SQL登录名有足够的权限访问主数据库。当然,sqlConnection.Open;应该用try{}catchException e{}包装,以防出现错误的登录/超时等情况。您不需要手动关闭连接,因为您将其包装在using语句中;如果出现错误的登录/超时等情况,应使用try{}catch异常e{}包装@Dannybecket:不应使用空catch来处理连接问题。那么最好让异常冒泡到全局处理程序。因为它不是这个问题的一部分,所以我没有展示它。空捕获不是这个想法,我只是指出您应该检查异常。
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");
    }
} 
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();
    }
}