2

当時使用されていたパラメータ化されたクエリがなかった、かなり古いアプリケーションに取り組んでいます。

sqlデータ型としてテーブルの列に日時値を挿入する必要がありdate-timeます。この列では null 値は許可されていません。

私のコード。

var expires = dtpExpires.Enabled ? dtpExpires.Value.ToString() : "'1/1/1900 12:00:00 AM'";
string query = "INSERT INTO route (expires) Values ("+ expires +")";

これに関する問題は、日付ピッカーが無効になっている場合、null が許可されていないため、デフォルト値を渡す必要があることです。'' そのため、日付をラップするエクストラを含める必要があり、正しく機能します。

しかし、日付ピッカーが有効になっていて、有効な日時がデータベースに挿入されようとすると、変数''をラップしていないために失敗します。expires

パラメータ化されたクエリなしでこれを行うためのクリーンなアプローチはありますか? コードの更新中に同じ問題が発生します。if-else節だけを追加するのではなく、両方のケースでこれが機能するためのクリーンなアプローチはありますか。

4

2 に答える 2

2

編集

「'string' と 'System.DBNull' の間に暗黙的な変換がないため、条件式の型を特定できません」を回避するには

SqlCommand command = new SqlCommand("INSERT INTO route (expires) 
                                   Values (@dtpExpires)", connections);
SqlParameter dtpExpires= new SqlParameter("@dtpExpires", SqlDbType.DateTime, 10);
dtpExpires.Value = dtpExpires.Enabled ? dtpExpires.Value : DBNull.Value;
command.Parameters.Add(dtpExpires);

あなたのための情報 OP@ankur

連結の代わりにパラメーターを使用する利点

  • 安全性。連結により、特に TB が Textbox を表す場合、SQL インジェクションが可能になります。(必須の XKCD 漫画)
  • タイプセーフティ。多くの DateTime と数値の書式設定の問題を解決します。
  • スピード。クエリは常に変更されるわけではありません。システムはクエリ ハンドルを再利用できる場合があります。

ノート

sql インジェクション攻撃を回避するには、pram クエリを使用することをお勧めします。

于 2012-11-27T05:59:04.330 に答える
0

datetime と null データの両方を文字列として送信するため、CONVERT 関数を使用して、文字列から datetime への変換を SQL サーバーで処理させます。

  var expires = dtpExpires.Enabled ? "'" + tpExpires.Value.ToString() + "'" : "null";

  string query = "INSERT INTO route (expires) Values (CONVERT(datetime, " + expires + "))";
于 2012-11-27T08:04:32.153 に答える