2

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

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

これは、データベースで実行すると得られるものです

4

2 に答える 2

1

これを行う場合:

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

あなたはこれをしたくない:

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

ここで 3 つの問題が発生する可能性があります。

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

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

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

テーブルに 0 個、1 個、または 2 個のレコードがある場合に何が起こるかを試してみてください。

于 2016-08-15T19:31:33.020 に答える
1

- アップデート -

動作するようになりました。接続文字列に 1 文字がありませんでした。接続文字列の接続タイムアウト部分を取り出したときに起こったと思います。

ご提案ありがとうございます!!!

于 2016-08-15T19:05:54.867 に答える