【问题标题】:Check if Database exists MSSQL C#检查数据库是否存在 MSSQL C#
【发布时间】:2018-05-16 10:12:35
【问题描述】:

我有这样的代码:

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;
    }

然而

nRet

结果总是-1,就好像数据库不存在(确实存在)。 是因为数据库是空的吗? 或者如果创建了数据库,它是否应该返回 >0,即使它是空的? 顺便说一句,字符串 databaseName 是正确的。

编辑> 编辑: 我在“CREATE DATABASE @database”ssql 命令上也遇到了意外错误:

''@userDatabase' 附近的语法不正确

代码是这样的:

    var connString = "Server=localhost\\SQLEXPRESS;Integrated Security = SSPI; database = master";
                string cmdText = "CREATE DATABASE @userDatabase";
                using (var sqlConnection = new SqlConnection(connString))
                {
                    using (var sqlCmd = new SqlCommand(cmdText, sqlConnection))
                    {
                        sqlCmd.Parameters.Add("@userDatabase", System.Data.SqlDbType.NVarChar).Value = databaseName;=
                        sqlConnection.Open();
                        sqlCmd.ExecuteNonQuery();
                    }
                }

【问题讨论】:

  • ExecuteNonQuery 不适用于 SELECT 语句(或者更好的是它不会从选择中返回任何内容)
  • 这里是我获取代码的地方:social.msdn.microsoft.com/Forums/en-US/…
  • 小心小圆桌。
  • ExecuteNonQuery 的 MSDN 文档指出:“对于 UPDATE、INSERT 和 DELETE 语句,返回值是受命令影响的行数。当正在插入的表上存在触发器或更新后,返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。对于所有其他类型的语句,返回值为-1 .如果发生回滚,返回值也是-1。”
  • 不,因为ExecuteNonQuery总是从任何不是 UPDATE、INSERT 或 DELETE 的东西中返回 -1。如果您的 SELECT 选择了 1,000 行,ExecuteNonQuery 仍将返回 -1。

标签: c# sql sql-server database uwp


【解决方案1】:
  1. 使用参数化查询。
  2. 使用Select count(*) 而不是Select *
  3. 使用ExecuteScalar 而不是ExecuteNonQuery
  4. 注意代码上的注释,它们解释了我所做的更改。
// No point of passing a bool if all you do is return it...
private bool CheckDatabase(string databaseName)
{
    // You know it's a string, use var
    var connString = "Server=localhost\\SQLEXPRESS;Integrated Security=SSPI;database=master";
    // Note: It's better to take the connection string from the config file.

    var cmdText = "select count(*) from master.dbo.sysdatabases where name=@database";

    using (var sqlConnection = new SqlConnection(connString))
    {
        using (var sqlCmd = new SqlCommand(cmdText, sqlConnection))
        {
            // Use parameters to protect against Sql Injection
            sqlCmd.Parameters.Add("@database", System.Data.SqlDbType.NVarChar).Value = databaseName;

            // Open the connection as late as possible
            sqlConnection.Open();
            // count(*) will always return an int, so it's safe to use Convert.ToInt32
            return Convert.ToInt32( sqlCmd.ExecuteScalar()) == 1;
        }
    }

}

【讨论】:

  • 如何检查数据库是否存在?我
  • 之后我应该关闭连接吗?
  • bool doesExists = CheckDatabase("My database");,您不需要关闭连接,因为using 语句正在处理它,而Dispose 正在为您执行此操作。
  • 很高兴为您提供帮助 :-)
  • 嘿,检查表是否存在同样有效吗?查询应该是什么?
【解决方案2】:

不,您不能使用 ExecuteNonQuery 从 SELECT 语句中返回某些内容,您指向该 MSDN 论坛的链接包含不正确的答案(正如您已经尝试过的那样)

MSDN 文档解释说 ExecuteNonQuery 仅针对 UPDATE/INSERT/DELETE 查询返回受 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 语句
  • 数据库名称应作为参数而不是字符串传递 串联
  • 不要调用 ExecuteNonQuery 而只是调用 ExecuteScalar 来获得简单的 IF EXIST(... condition...) SELECT 0/1 语句返回的标量值
  • 返回值可以简化

【讨论】:

  • 我需要在CheckDatabase方法之外获取bool值
  • bool 结果 = CheckDatabase("yourdatabasename");
  • 关于使用exists 的好处,虽然你可能会使用select case when exists.... then 1 else 0 end;
【解决方案3】:

如果你知道数据库文件在哪里,可以使用File.Exists()

if (File.Exists(DatabaseFile))

{
 //DoSomething
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-26
    • 2015-06-18
    • 2021-11-30
    • 2014-07-08
    • 2019-06-24
    • 2014-04-03
    • 1970-01-01
    相关资源
    最近更新 更多