2016-08-15 25 views
0

ExecuteScalar()を使用してデータベースから整数を返そうとしています。しかし、データベース自体でクエリを実行すると、正しい答えが得られ、C#は常に0(NULL)を返します。私はid = Convert.ToInt32(command.ExecuteScalar());を追加する前に、NULLが処理されていることを確認するエラーが出るので、nullを返すことを知っています。私はそれが3 btwを返すことを期待しています。ExecuteScalar()は常にNULLを返します

private int getFamilyId() 
{ 
    int id = 0; 
    using (SqlConnection connection = new SqlConnection(Globaldata.ConnectionString)) 
    { 
     using (SqlCommand command = new SqlCommand()) 
     { 
      string sqlString = @"SELECT [Id] FROM [dbo].[FamilyDetails];"; 
      command.Connection = connection; 
      command.CommandText = sqlString; 
      try 
      { 
       connection.Open(); 
       id = Convert.ToInt32(command.ExecuteScalar()); 
      } 
      catch (Exception e) 
      { 
       MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK); 
      } 
      finally 
      { 
       connection.Close(); 
      } 
      return id; 
     } 
    } 
} 

This is what I get when I run it on the database

+1

接続文字列を確認します。クエリを実行しているのと同じデータベースを指していますか? – user3185569

+0

削除するとどうなりますか?クエリテキストに? –

+0

はい、データベースから接続文字列をコピーしたため、正しいデータベースです.-> properties-> connectionstring。 –

答えて

0

あなたが行う場合は、この:

string sqlString = @"SELECT [Id] FROM [dbo].[FamilyDetails];"; 

あなたがこれを行うにはしたくない:

id = Convert.ToInt32(command.ExecuteScalar()); 

3つのことは間違ってここに行くことができます。

  • 問題#1: 行がテーブルに存在しない場合は、command.ExecuteScalar()ヌルを返すウィル。

  • 問題#2: テーブルに行がある場合、command.ExecuteScalar()は、SELECT文が1の値に制限されていないため、発生する最初の行の値を返します。

  • 問題#3: にId列が、NOT NULL command.ExecuteScalar(として宣言されていない場合)は、整数に変換するときは意味がありませんDbNullにを、返すことができます。

テーブルに0または1または2のレコードがあるとどうなるか試してみてください。

+0

このコード行をどのように変更することをお勧めしますか? –

+0

create table文とIDの値が必要な理由を除いて、あなたの質問に答えることは不可能です。 ExecuteScalarは1つの値しか返しませんが、SELECTステートメントは値をまったく返しません。 – sunnyhighway

0

--UPDATE--

それが動作するようになりました、私の接続文字列が欠落している一つの文字を持っていました。私は接続文字列の接続タイムアウト部分を取り出したときに起こったと思います。

ありがとうございます。

+3

あなたの接続文字列は、固定されたときの前と後になりました。それらにも言及してください。 –

+0

これはちょうどタイプミスで、間違ってeを削除しました。 元の接続: 'データソース=(LocalDB)\ MSSQLLocalDB; AttachDbFilename = D:\ Users \ RecordDatabaseFile.mdf;統合セキュリティ= Tru;接続タイムアウト= 10' 「データソース=(LocalDB)\ MSSQLLocalDB; AttachDbFilename = D:\ Users \ RecordDatabaseFile.mdf;統合セキュリティ= True;接続タイムアウト= 10」 –

関連する問題