1

日付ピッカー ボックスを備えたこの C# Web フォームがあります。日付が何も設定されていない場合 (デフォルト)、データベースに NULL を渡します。これは、パラメータ化されたクエリ内で発生します。

SqlParameter CMActionDate = new SqlParameter();
CMActionDate.ParameterName = "@ActionDate";
if (ActionDate.Equals(""))
  {
      CMActionDate.Value = System.Data.SqlTypes.SqlDateTime.Null;
  }
  else
  {
      CMActionDate.Value = ActionDate;
  }

デバッグをオンにすると、日付が実際に "" であることがわかります。したがって、IF ステートメントに入り、そうすべきだと思うように actiondate.value を {Null} に設定します。

でも。

次に非クエリを実行するときに、虫めがねをクリックすると、次のように表示されます。

UPDATE table SET [action_date] = '' WHERE [id] = 2488

私が見たいのはこれです:

UPDATE table SET [action_date] = 'Null' WHERE [id] = 2488

action_date が実際に NULL に設定されることはないため、datetime フィールドの値は "01/01/1900 12:00:00AM" に戻り、それ自体が面倒です。

CMActionDate.Value を次の値に設定しようとしましたが、役に立ちませんでした (上記と同じ結果が得られます)。

  • DBNull.Value;
  • "ヌル";
  • SqlDateTime.Null;
  • ヌル;

ヘルプ。

編集

多分私ははっきりしていませんでしたか?はい、もちろん、パラメータ化されたクエリは次のようになります。

"UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "' WHERE [id] = " + @CM_id + "";

しかし、VS でこのことをデバッグしているときは、ExecuteNonQuery(); の直前にブレークポイントを置きます。実行しようとしている SQL を確認できます。そこに実際の SQL が表示され、action_date='' のビットが表示されます。

それは役に立ちますか?

4

3 に答える 3

13

'' または 'Null' は表示されません。パラメータ化されたクエリを正しく使用している場合、次のようになります。

UPDATE テーブル SET [action_date] = @ActionDate WHERE [id] = @ID

パラメーター化されたクエリの要点は、実際のパラメーター値がクエリ文字列に直接代入され ないことです。

クエリ コードは次のようになります。

string sql = "UPDATE table SET [action_date]= @ActionDate WHERE [id]= @CM_id";

using (var cn = new SqlConnection("your connection string here."))
using (var cmd = new SqlCommand(sql, cn))
{
    cmd.Parameters.Add("@ActionDate", SqlDbTypes.DateTime).Value = 
         ActionDate.Equals("")? DBNull.Value : DateTime.Parse(ActionDate);
    cmd.Parameters.Add("@CM_id", SqlDbTypes.Int).Value = 2488;

    cn.Open();
    cmd.ExecuteNonQuery();
}

このコードの結果として、クエリ パラメータがデータとしてサーバーに送信されます。C# コードのどの時点でも、データが置換されたクエリ文字列を表示することはできません。クエリ文字列はサーバーに個別に送信されます。

これにより、パラメーター値のサニタイズ中にエラーが発生したために、サーバーがパラメーター値をコードとして実行する可能性がなくなります。データは完全に分離されており、そもそもそのコンテキストのためにサニタイズする必要はありません。また、サーバーがクエリの実行プランをキャッシュして再利用できるようにするため、パフォーマンスが (わずかに) 向上します。

于 2009-02-24T19:22:53.567 に答える
1

パラメータ化されたクエリが表示されるはずです

UPDATE table SET [action_date] = @ActionDate WHERE [id] = @id

また、パラメーター値には null と同等の値が必要です。

あなたのSQLは

"UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "' 
 WHERE [id] = " + @CM_id + "";

これは本当に意味がありません。動的 SQL クエリを作成するのではなく、SQL で @ActionDate と @CM_ID を置き換える必要があります。

SQLは文字通り次のようになります。

String sql = "UPDATE table SET [action_date] = @ActionDate WHERE [id] = @CM_id"

変数の前後に文字列を連結したり、引用符で囲んだりしないでください。

于 2009-02-24T19:24:40.927 に答える
0

あなたのクエリは、投稿されたもののようには見えません。

@parameter を正しく読み取るには、文字列内にある必要があります。@ActionDate が存在しない可能性が高いため、 ActionDate = '' が表示されます。

次のようなものが必要です

string sql = "UPDATE CM_Codebase SET [action_date] = @ActionDate WHERE [id] = @CM_id";

文字列の連結が行われていないことに注意してください。

于 2009-02-24T19:51:40.767 に答える