0

我正在使用下面的代码来查找数据库是否存在但ExecuteNonQuery总是返回-1。

我已经看到了master.sys.databases视图,它有数据库POS

SqlConnection tmpConn = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=master;Integrated Security=True");

sqlCheckDBQuery = "SELECT * FROM master.sys.databases where name = \'aspnetdb\'";

using (tmpConn)
{
    try
    {
        tmpConn.Open();
        tmpConn.ChangeDatabase("master");
    }
    catch (Exception)
    {
        MessageBox.Show("SQLServer Express Database is either not installed or not running!", "Database Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
        Application.Exit();
    }

    using (SqlCommand sqlCmd = new SqlCommand(sqlCheckDBQuery, tmpConn))
    {
        int exists = sqlCmd.ExecuteNonQuery();

        if (exists <= 0)
            databaseExists = false;
        else
            databaseExists = true;
    }
}
4

4 回答 4

4

在此特定情况下,您可以使用标量查询而不是数据读取器。

sqlCheckDBQuery = "SELECT count(1) FROM master.sys.databases where name = 'aspnetdb'";
var count = (int)sqlCmd.ExecuteScalar();
databaseExists = count > 1;
于 2012-01-12T13:55:14.070 回答
1

您应该使用ExecuteScalar()并更改查询以运行COUNT(*).

ExecuteScalar将带回受影响的行。

ExecuteNonQuery()SELECT将为's带回 -1 。

于 2012-01-12T13:54:35.007 回答
0

ExecuteNonQuery()是错误的使用方法。改为使用ExecuteReader():例如:

var reader = command.ExecuteReader();
if (reader.Read())
    ....
于 2012-01-12T13:51:28.090 回答
0
sqlCheckDBQuery = "SELECT * FROM master.sys.databases where name = \'aspnetdb\'";

你为什么在这里使用反斜杠?数据库的名称aspnetdb应该是这样的:

sqlCheckDBQuery = "SELECT * FROM master.sys.databases where name = 'aspnetdb'";

此外,正如其他答案中提到的那样,您不能ExecuteNonQuery()在此处使用,因为对于 select 语句,它将始终返回 -1。

于 2012-01-12T13:54:48.267 回答