4

テキストボックスが空の場合、SQL テーブルの日時フィールドを NULL に設定しようとしていますが、これを機能させることができないようです。

        string EndDate = "";
        if (String.IsNullOrEmpty(EndDateTxtBox.Text.Trim()))
        {
            EndDate = null;
        }
        else
        {
            EndDate = EndDateTxtBox.Text;
        }

        var sql = String.Format(@"UPDATE Test SET StartDate='{0}', 
                                 EndDate='{1}' WHERE ID = '{2}'",
                                 StartDateTxtBox.Text, EndDate, id);

これを実行してブレークポイントを配置すると、「var sql」に対して次のようになります。

"UPDATE Test SET StartDate='5/23/2013', EndDate=" WHERE ID = '19'"

SQL文字列から ' を削除しようとしましたが、それもうまくいきませんでした。助言がありますか?

編集: SQL インジェクションを防止することの重要性は理解していますが、これは私の使用のみを目的とした内部 Web サーバー上のページであり、公開されていません。個人的なことを追跡するのに役立ちます。

4

5 に答える 5

1

問題は一重引用符のようです。NULL の場合は、それらを持つべきではありません。

また、パラメータ化されたクエリを使用することもできます (安全上の理由と値を渡すため)。その場合、引用符も必要ありません。

于 2013-06-10T15:20:55.763 に答える
0

C# コード内の SQL のベスト プラクティスとは見なされないコードの問題にもかかわらず、いくつかの問題があります。

  1. EndDate を C# null に設定しています。これは、DBNull.Value として示される SQL NULL と同じではありません。

  2. NULL は SQL で引用符を必要としないという事実を考慮していないため、#1 を修正したとしても、機能するためにはとにかく SQL を変更する必要があります。

ストアド プロシージャを作成することをお勧めします。終了日のテキストボックスが null の場合は、そのパラメーターを渡さず、ストアド プロシージャで既定値を NULL にします。

Create Procedure usp_TestDateRange_Update
( @ID int -- or whatever type your ID is
  @StartDate DateTime,
  @EndDate DateTime = NULL)
As 
  Update Test
  Set StartDate = @StartDate,
      EndDate = @EndDate
  Where ID = @ID

そんな感じ。ここで行う必要があるのは、C# コードでストアド プロシージャを呼び出し、テキスト ボックスからの呼び出しにパラメーターを追加することです。

于 2013-06-10T15:24:26.870 に答える
0

エラーはにあると思いますstring.format line。文字列部分に改行を含めることはできません。次のいずれかを試してください。

 var sql = String.Format(
          @"UPDATE Test SET StartDate='{0}', EndDate='{1}' WHERE ID = '{2}'",
           StartDateTxtBox.Text, EndDate, id);

また、

    var sql = String.Format(@"UPDATE Test SET StartDate='{0}', " + 
                             "EndDate='{1}' WHERE ID = '{2}'",
                             StartDateTxtBox.Text, EndDate, id);

ただし、ここで他の回答が言及しているように、SQL インジェクションについて学び、別のアプローチを検討する必要があります。

于 2013-06-10T15:14:50.580 に答える