パラメータを使用しないため、このエラーが発生します。
string cmdStr = "SELECT COUNT(*) FROM Sale WHERE Date = @dt " +
"AND User = @usr " +
"AND Item = @itm " +
"AND Name = @name";
SqlCommand Pexist = new SqlCommand(cmdStr, myConnection3);
Pexist.Parameter.AddWithValue("@dt", DateTime.Today);
Pexist.Parameter.AddWithValue("@usr", UserBox.Text);
Pexist.Parameter.AddWithValue("@itm", ID505.Text);
Pexist.Parameter.AddWithValue("@name", DropDownList1.SelectedItem.ToString());
object result = Pexist.ExecuteScalar();
int P = (result == null ? 0 : Convert.ToInt32(result));
myConnection.Close();
パラメータを使用する場合は、データベースエンジンに入力文字列を処理させます。データベースエンジンは、日付、文字列、および数値の処理方法を知っています。解析の問題がなく、SQLインジェクション攻撃を回避できます。
たとえば、テキストボックスID505に一重引用符が含まれている場合、クエリ文字列はどうなりますか?
また、ExecuteScalarは、次のようなオブジェクトを返します。
結果セットの最初の行の最初の列、または結果セットが空の場合はnull参照(Visual BasicではNothing)
したがって、結果を整数に変換する前に、nullをチェックすることをお勧めします。
編集しばらくしてこの質問を振り返ると、この特定のケースでは、ExecuteScalarからの戻り値がnullになることはあり得ないことを追加する必要があります。これは、レコードが見つからない場合にも常に有効な数値を返す集計関数COUNT(*)をクエリが使用するためです。