-3

このエラーが発生するのはなぜですか。どうすれば修正できますか?

ADO.NETコード:

myConnection.Open();

string cmdStr = "SELECT COUNT(*) FROM Sale WHERE Date = '" + DateTime.Today + "' AND User = '" +     UserBox.Text + "'";

SqlCommand Pexist = new SqlCommand(cmdStr, myConnection3);

int P = Convert.ToInt32(Pexist.ExecuteScalar().ToString());

myConnection.Close();

エラー:

文字列から日付や時刻を変換するときに変換に失敗しました。

4

3 に答える 3

4

パラメータを使用しないため、このエラーが発生します。

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(*)をクエリが使用するためです。

于 2012-11-21T23:08:26.710 に答える
0

パラメータを使用してください。より安全で、このような変換の問題を回避できます...

string cmdStr = " SELECT COUNT(*) FROM Sale WHERE Date = @d AND User = @u AND Item = @i AND Name = @n";
SqlCommand Pexist = new SqlCommand(cmdStr, myConnection3);
Pexist.Parameters.Add("d", SqlDataType.DateTime).Value = DateTime.Today;

等々...

于 2012-11-21T23:05:40.373 に答える
-2

DateTime.TodayをDateTime.Today.ToString( "yyyy / MM / dd")に置き換えると、問題が解決するはずです。

于 2012-11-21T23:07:13.470 に答える