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()-1を返しSELECTます。

于 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 に答える