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") + ")";   }

如果任何属性为空,我在插入时遇到问题,比如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 回答
0

我已经解决了以下风格的问题

string sql= insert into Table(limit) values("+TBkapidaMinLimit.Text==""?"null":TBkapidaMinLimit.Text)+")"
于 2017-04-04T11:27:38.410 回答