C# 检查数据库是否存在MSSQL C

C# 检查数据库是否存在MSSQL C,c#,sql,sql-server,database,uwp,C#,Sql,Sql Server,Database,Uwp,我有这样的代码: private bool CheckDatabase(string databaseName, bool bRet) { string connString = "Server=localhost\\SQLEXPRESS;Integrated Security=SSPI;database=master"; string cmdText = "select * from master.dbo.sysdatabases where name=

我有这样的代码:

private bool CheckDatabase(string databaseName, bool bRet)
    {
        string connString = "Server=localhost\\SQLEXPRESS;Integrated Security=SSPI;database=master";
        string cmdText = "select * from master.dbo.sysdatabases where name=\'" + databaseName + "\'";



        using (SqlConnection sqlConnection = new SqlConnection(connString))
        {
            sqlConnection.Open();
            using (SqlCommand sqlCmd = new SqlCommand(cmdText, sqlConnection))
            {
                int nRet = sqlCmd.ExecuteNonQuery();
                // regMessage.Text = nRet.ToString();
                if (nRet <= 0)
                {
                    bRet = false;
                }
                else
                {
                    bRet = true;
                }
            }
        }
        return bRet;
    }
使用参数化查询。 使用Select count*而不是Select*。 使用ExecuteScalar而不是ExecuteOnQuery 注意代码上的注释,它们解释了我所做的更改。 使用参数化查询。 使用Select count*而不是Select*。 使用ExecuteScalar而不是ExecuteOnQuery 注意代码上的注释,它们解释了我所做的更改。 不,您不能使用SELECT语句返回内容,您指向该MSDN论坛的链接包含错误答案,因为您已经尝试过了

MSDN docs解释说,ExecuteOnQuery仅在更新/插入/删除查询时返回受sql语句影响的行数。要计算受SELECT影响的行数,它应该检索结果,但需要做更多的工作。这可能不符合性能要求

因此,您可以将函数更改为

private bool CheckDatabase(string databaseName)
{
    string connString = "Server=localhost\\SQLEXPRESS;Integrated Security=SSPI;database=master";
    string cmdText = @"if Exists(select 1 from master.dbo.sysdatabases where name=@db) 
                       select 1 else select 0";
    using (SqlConnection sqlConnection = new SqlConnection(connString))
    {
        sqlConnection.Open();
        using (SqlCommand sqlCmd = new SqlCommand(cmdText, sqlConnection))
        {
            sqlCmd.Parameters.Add("@db", SqlDbType.NVarChar).Value = databaseName;
            int nRet = Convert.ToInt32(sqlCmd.ExecuteScalar());
            return (nRet > 0);
        }
    }
}
我改变了什么:

作为参数传递的bool变量不是必需的 检查数据库是否存在最有效的方法是通过IF EXIST语句 数据库名称应作为参数而不是字符串传递 串联 不要调用ExecuteOnQuery,只需调用ExecuteScalar即可获得简单的 如果存在,则返回标量值。。。条件选择0/1语句 返回值可以简化 不,您不能使用SELECT语句返回内容,您指向该MSDN论坛的链接包含错误答案,因为您已经尝试过了

MSDN docs解释说,ExecuteOnQuery仅在更新/插入/删除查询时返回受sql语句影响的行数。要计算受SELECT影响的行数,它应该检索结果,但需要做更多的工作。这可能不符合性能要求

因此,您可以将函数更改为

private bool CheckDatabase(string databaseName)
{
    string connString = "Server=localhost\\SQLEXPRESS;Integrated Security=SSPI;database=master";
    string cmdText = @"if Exists(select 1 from master.dbo.sysdatabases where name=@db) 
                       select 1 else select 0";
    using (SqlConnection sqlConnection = new SqlConnection(connString))
    {
        sqlConnection.Open();
        using (SqlCommand sqlCmd = new SqlCommand(cmdText, sqlConnection))
        {
            sqlCmd.Parameters.Add("@db", SqlDbType.NVarChar).Value = databaseName;
            int nRet = Convert.ToInt32(sqlCmd.ExecuteScalar());
            return (nRet > 0);
        }
    }
}
我改变了什么:

作为参数传递的bool变量不是必需的 检查数据库是否存在最有效的方法是通过IF EXIST语句 数据库名称应作为参数而不是字符串传递 串联 不要调用ExecuteOnQuery,只需调用ExecuteScalar即可获得简单的 如果存在,则返回标量值。。。条件选择0/1语句 返回值可以简化
如果知道数据库文件的位置,可以使用file.Exists:


如果知道数据库文件的位置,可以使用file.Exists:


ExecuteOnQuery不适用于SELECT语句,或者更好,它不从SELECT返回任何内容。我从这里获得代码:小心小bobby表。ExecuteOnQuery的MSDN文档说明:对于UPDATE、INSERT和DELETE语句,返回值是受命令影响的行数。当插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,则返回值也为-1。否,因为ExecuteOnQuery将始终从任何未更新、插入或删除的内容返回-1。如果您选择了1000行,ExecuteOnQuery仍将返回-1。ExecuteOnQuery不适用于SELECT语句,或者更好,它不从SELECT语句返回任何内容。我的代码来源是:小心小bobby表。ExecuteOnQuery的MSDN文档说明:对于UPDATE、INSERT和DELETE语句,返回值是受命令影响的行数。当插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,则返回值也为-1。否,因为ExecuteOnQuery将始终从任何未更新、插入或删除的内容返回-1。如果您选择了1000行,ExecuteOnQuery仍将返回-1。如何检查数据库是否存在?I我应该在之后关闭连接吗?bool doesExists=checkdatabase我的数据库;,您不需要关闭连接,因为using语句正在处理它,而Dispose正在为您执行此操作。很高兴为您提供帮助:-嘿,检查表是否存在是否也可以使用相同的方法?查询应该是什么?如何检查数据库是否存在?I我应该在之后关闭连接吗?bool doesExists=checkdatabase我的数据库;,您不需要关闭连接,因为using语句正在处理它,而Dispose正在为您执行此操作。很高兴为您提供帮助:-嘿,检查表是否存在是否也可以使用相同的方法?查询应该是什么?我需要在CheckDatabase方法bool result=CheckDatabaseyourdatabasename;关于exists的使用有一个很好的观点,尽管当exists存在时,您可能会选择case。。。。然后1,否则0结束;我需要获取CheckDatabase方法之外的bool值 bool result=CheckDatabaseyourdatabasename;关于exists的使用有一个很好的观点,尽管当exists存在时,您可能会选择case。。。。然后1,否则0结束;
private bool CheckDatabase(string databaseName)
{
    string connString = "Server=localhost\\SQLEXPRESS;Integrated Security=SSPI;database=master";
    string cmdText = @"if Exists(select 1 from master.dbo.sysdatabases where name=@db) 
                       select 1 else select 0";
    using (SqlConnection sqlConnection = new SqlConnection(connString))
    {
        sqlConnection.Open();
        using (SqlCommand sqlCmd = new SqlCommand(cmdText, sqlConnection))
        {
            sqlCmd.Parameters.Add("@db", SqlDbType.NVarChar).Value = databaseName;
            int nRet = Convert.ToInt32(sqlCmd.ExecuteScalar());
            return (nRet > 0);
        }
    }
}
if (File.Exists(DatabaseFile))

{
 //DoSomething
}