2012-01-12 14 views
0

データベースが存在するかどうかを確認するために以下のコードを使用していますが、ExecuteNonQueryは常に-1を返します。SQL Server 2008 R2のmaster.sys.databasesビューをc#から照会できません

私は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

この特定のインスタンスでは、データリーダーの代わりにスカラークエリを使用できます。

sqlCheckDBQuery = "SELECT count(1) FROM master.sys.databases where name = 'aspnetdb'"; 
var count = (int)sqlCmd.ExecuteScalar(); 
databaseExists = count > 1; 
+0

は魅力的に機能しましたが、なぜSqlDataReaderが行を返さないのか不思議です(私はExecuteReaderで試しました) –

0

ExecuteNonQuery()が使用する間違った方法でデータベースを持っています。代わりにExecuteReader()を使用します。例えば:

var reader = command.ExecuteReader(); 
if (reader.Read()) 
    .... 
+0

何を使用すればよいですか? –

+0

@UzairFarooq更新された回答 –

+0

を参照してください。まだ0行を返しています。1行を返す必要があります。 –

1

あなたはExecuteScalar()を使用してCOUNT(*)を実行するためのクエリを変更する必要があります。

ExecuteScalar影響を受ける行を戻します。

ExecuteNonQuery()は、SELECTの場合は-1を返します。

+1

+1 ExecuteScalar()はここに行く方法です。私はそれを完全に忘れる。 – Yuck

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

なぜここでバックスラッシュを使用していますか?データベースの名前はaspnetdbあるので、これは次のようになります。他の回答に記載されているようにそれは常に戻りますので、-1 select文のため

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

また、あなたがここにExecuteNonQuery()を使用することはできません。

関連する問題