2

私はこのコードを持っています

public void insertAssignment(long mediaEvent_ID, long mediaBranch_ID,
int? isPremiere, int? isNew, int? isLastChance, 
int? isPrevShown, int season_ID, int? audio_ID, 
int? video_ID, DateTime startdate)
{
    query = "insert into Assignment Values(" + mediaEvent_ID+ "," 
    + mediaBranch_ID + "," + isPremiere + "," + isNew + "," 
    + isLastChance + "," + isPrevShown
    + "," + season_ID + "," + audio_ID + "," + video_ID + ",'" +  
    startdate.ToString("MM/dd/yyyy") + ")";   }

問題のような属性がnullの場合、挿入中にisPremiere=null問題がありますinsert {values(mediaEvent,mediaBranch,(is empty not contains a values ),......)}

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

8

リテラルを使用して tsql を記述している場合は、null シナリオを検出し、値ではなく「null」を追加する必要があるため、SQL は次のようになります。

1,2,null,4,5

私の言いたいことがわかるなら。ただし、これは悪い方法です。現在の SQL は本当に危険です。代わりにパラメーター化する必要があります-これにより、さまざまな問題が解決されます。

  • SQLインジェクション(あなたのコードは現在セキュリティリスクです)
  • フォーマット(日付など)
  • ヌル値
  • クエリプランの再利用 (またはその欠如)

例えば:

query = "insert into Assignment Values(@eventId, @branchId, @isPremiere, @isNew, ...)"

ここで、各プレースホルダーの値を持つパラメーターを追加します。ado.net の方法により、DBNull でヌルを表す必要があることに注意してください。

cmd.Parameters.AddWithValue("foo",
    foo == null ? (object)DBNull.Value : (object)foo);

(パラメータごと)

orms と micro-orms がこれを簡単にするのに役立つことに注意してください。たとえば、ダッパーの場合:

DateTime foo = ...
int? bar = ...
connection.Execute(
     @"insert ... values (@foo, @bar)",
    new { foo, bar });
于 2013-07-06T07:17:39.053 に答える