C# 向存储过程发送null参数

C# 向存储过程发送null参数,c#,asp.net,sql,stored-procedures,C#,Asp.net,Sql,Stored Procedures,我有科目课。它的成员是id\u subject(int)和subjectName(string) 我创建了一个列表 List<Subject> listSubject = new List<Subject>(); List listSubject=new List(); 并将其发送到此存储过程: public bool AddNewNews(News news, List<Subject> subject) { SqlParameter

我有
科目
课。它的成员是
id\u subject
int
)和
subjectName
string

我创建了一个列表

List<Subject> listSubject = new List<Subject>();
List listSubject=new List();
并将其发送到此存储过程:

 public bool AddNewNews(News news, List<Subject> subject)
 {
        SqlParameter[] parameters = new SqlParameter[]
        {
           new SqlParameter ("@title",news.Title),
           new SqlParameter ("@text",news.Text),
           new SqlParameter ("@year",news.Year),    
           new SqlParameter ("@month",news.Month) ,    
           new SqlParameter ("@day",news.Day) ,   
           new SqlParameter ("@id_writer",news.Id_writer)  ,
           new SqlParameter ("@id_subject1",subject[0]!=null? subject[0].Id_subject:null),
           new SqlParameter ("@id_subject2",subject[1]!=null? subject[1].Id_subject:null) ,
           new SqlParameter ("@id_subject3",subject[2]!=null? subject[2].Id_subject:null), 
           new SqlParameter ("@id_subject4",subject[3]!=null? subject[3].Id_subject:null),
           new SqlParameter ("@id_subject5",subject[4]!=null? subject[4].Id_subject:null)
    };

    return SqlDBHelper.ExecuteNonQuery("AddNewNews", CommandType.StoredProcedure, parameters);
}
public bool addnewnewnews(新闻,列表主题)
{
SqlParameter[]参数=新的SqlParameter[]
{
新的SqlParameter(“@title”,news.title),
新的SqlParameter(“@text”,news.text),
新的SqlParameter(“@year”,news.year),
新的SqlParameter(“@month”,news.month),
新的SqlParameter(“@day”,news.day),
新的SqlParameter(“@id_writer”,news.id_writer),
新的SqlParameter(“@id\u subject1”,subject[0]!=null?subject[0]。id\u subject:null),
新的SqlParameter(“@id\u subject2”,subject[1]!=null?subject[1]。id\u subject:null),
新的SqlParameter(“@id\u subject3”,subject[2]!=null?subject[2]。id\u subject:null),
新的SqlParameter(“@id\u subject4”,subject[3]!=null?subject[3]。id\u subject:null),
新的SqlParameter(“@id\u subject5”,subject[4]!=null?subject[4]。id\u subject:null)
};
返回SqlDBHelper.ExecuteOnQuery(“AddNewNews”,CommandType.StoredProcess,参数);
}
第一:如果不是真的,那么就简短

我将它们强制转换为对象并发送到存储过程

BEGIN TRANSACTION;

   DECLARE @last_id_news int

   BEGIN TRY
      insert into news (title, text, year, month, day, id_writer)
      values(@title, @text, @year, @month, @day, @id_writer)

      set @last_id_news = SCOPE_IDENTITY()

      if(@id_subject1 <> null)
      begin
           insert into news_subject (id_news, id_subject) 
           values (@last_id_news, @id_subject1)
      end

      if(@id_subject2 <> null)
      begin
         insert into news_subject (id_news, id_subject) 
         values (@last_id_news, @id_subject2)
      end

      if(@id_subject3 <> null)
      begin
         insert into news_subject (id_news, id_subject) 
         values (@last_id_news, @id_subject3)
      end

if(@id_subject4<>null)
begin
    insert into news_subject (id_news,id_subject) values (@last_id_news,@id_subject4)
end
if(@id_subject5<>null)
begin
    insert into news_subject (id_news,id_subject) values (@last_id_news,@id_subject5)
end

    COMMIT TRANSACTION;
END TRY
BEGIN CATCH

ROLLBACK TRANSACTION;
END CATCH;

RETURN
开始交易;
声明@last\u id\u news int
开始尝试
插入新闻(标题、文本、年、月、日、id_作者)
值(@title、@text、@year、@month、@day、@id\u writer)
设置@last\u id\u news=SCOPE\u IDENTITY()
if(@id\u subject1 null)
开始
插入新闻主题(id\U新闻,id\U主题)
值(@last\u id\u news,@id\u subject1)
结束
if(@id\u subject2 null)
开始
插入新闻主题(id\U新闻,id\U主题)
值(@last\u id\u news,@id\u subject2)
结束
if(@id\u subject3 null)
开始
插入新闻主题(id\U新闻,id\U主题)
值(@last\u id\u news,@id\u subject3)
结束
if(@id\u subject4null)
开始
将值(@last\u id\u news,@id\u subject4)插入新闻主题(id\u news,id\u subject)
结束
if(@id_subject5null)
开始
将值(@last\u id\u news,@id\u subject5)插入新闻主题(id\u news,id\u subject)
结束
提交事务;
结束尝试
开始捕捉
回滚事务;
末端捕捉;
返回

为什么不起作用?

您正在查找
DBNull.Value

类似的问题


  • 您正在查找
    DBNull.Value

    类似的问题


  • 您正在查找
    DBNull.Value

    类似的问题


  • 您正在查找
    DBNull.Value

    类似的问题


  • 正如在评论和回答中已经提到的,
    DBNull
    是这里令人讨厌的要求;您可以使用null合并运算符使其具有相当的可读性,但是:

       new SqlParameter ("@id_subject1",((object)subject[0]) ?? DBNull.Value),
       new SqlParameter ("@id_subject2",((object)subject[1]) ?? DBNull.Value),
       new SqlParameter ("@id_subject3",((object)subject[2]) ?? DBNull.Value),
       new SqlParameter ("@id_subject4",((object)subject[3]) ?? DBNull.Value),
       new SqlParameter ("@id_subject5",((object)subject[4]) ?? DBNull.Value),
    
    或者更好:也许您的
    ExecuteNonQuery
    方法可以循环遍历参数并检查
    .Value==null
    ,如果是,则将其替换为
    DBNull.Value

    P>可选地,考虑一个工具,比如“DaPrter”,它将方便地为你做这一切:

    connection.Execute("AddNewNews", new {
        title = news.Title,
        //...
        id_writer = news.Id_writer,
        id_subject1 = subject[0],
        //...
        id_subject5 = subject[4],
    }, commandType: CommandType.StoredProcedure);
    

    然后使用适当处理的空值对其进行完全参数化。

    如注释和答案中所述,
    DBNull
    是这里令人讨厌的要求;您可以使用null合并运算符使其具有相当的可读性,但是:

       new SqlParameter ("@id_subject1",((object)subject[0]) ?? DBNull.Value),
       new SqlParameter ("@id_subject2",((object)subject[1]) ?? DBNull.Value),
       new SqlParameter ("@id_subject3",((object)subject[2]) ?? DBNull.Value),
       new SqlParameter ("@id_subject4",((object)subject[3]) ?? DBNull.Value),
       new SqlParameter ("@id_subject5",((object)subject[4]) ?? DBNull.Value),
    
    或者更好:也许您的
    ExecuteNonQuery
    方法可以循环遍历参数并检查
    .Value==null
    ,如果是,则将其替换为
    DBNull.Value

    P>可选地,考虑一个工具,比如“DaPrter”,它将方便地为你做这一切:

    connection.Execute("AddNewNews", new {
        title = news.Title,
        //...
        id_writer = news.Id_writer,
        id_subject1 = subject[0],
        //...
        id_subject5 = subject[4],
    }, commandType: CommandType.StoredProcedure);
    

    然后使用适当处理的空值对其进行完全参数化。

    如注释和答案中所述,
    DBNull
    是这里令人讨厌的要求;您可以使用null合并运算符使其具有相当的可读性,但是:

       new SqlParameter ("@id_subject1",((object)subject[0]) ?? DBNull.Value),
       new SqlParameter ("@id_subject2",((object)subject[1]) ?? DBNull.Value),
       new SqlParameter ("@id_subject3",((object)subject[2]) ?? DBNull.Value),
       new SqlParameter ("@id_subject4",((object)subject[3]) ?? DBNull.Value),
       new SqlParameter ("@id_subject5",((object)subject[4]) ?? DBNull.Value),
    
    或者更好:也许您的
    ExecuteNonQuery
    方法可以循环遍历参数并检查
    .Value==null
    ,如果是,则将其替换为
    DBNull.Value

    P>可选地,考虑一个工具,比如“DaPrter”,它将方便地为你做这一切:

    connection.Execute("AddNewNews", new {
        title = news.Title,
        //...
        id_writer = news.Id_writer,
        id_subject1 = subject[0],
        //...
        id_subject5 = subject[4],
    }, commandType: CommandType.StoredProcedure);
    

    然后使用适当处理的空值对其进行完全参数化。

    如注释和答案中所述,
    DBNull
    是这里令人讨厌的要求;您可以使用null合并运算符使其具有相当的可读性,但是:

       new SqlParameter ("@id_subject1",((object)subject[0]) ?? DBNull.Value),
       new SqlParameter ("@id_subject2",((object)subject[1]) ?? DBNull.Value),
       new SqlParameter ("@id_subject3",((object)subject[2]) ?? DBNull.Value),
       new SqlParameter ("@id_subject4",((object)subject[3]) ?? DBNull.Value),
       new SqlParameter ("@id_subject5",((object)subject[4]) ?? DBNull.Value),
    
    或者更好:也许您的
    ExecuteNonQuery
    方法可以循环遍历参数并检查
    .Value==null
    ,如果是,则将其替换为
    DBNull.Value

    P>可选地,考虑一个工具,比如“DaPrter”,它将方便地为你做这一切:

    connection.Execute("AddNewNews", new {
        title = news.Title,
        //...
        id_writer = news.Id_writer,
        id_subject1 = subject[0],
        //...
        id_subject5 = subject[4],
    }, commandType: CommandType.StoredProcedure);
    

    然后使用适当处理的空值对其进行完全参数化。

    使用
    DBNull.Value
    而不是
    null
    (当然是在C#code中)。您能否提供SP返回的内容?可能出现异常?不能对
    NULL
    使用常用的相等或不相等运算符。这将不起作用:
    如果(@id\u subject4null)
    。相反,您需要检查
    是否为空
    是否为非空
    ——因此,如果操作已完成,请将所有这些检查替换为:
    IF(@id\u subject4非空)…
    。返回true。可能重复使用
    DBNull.Value
    而不是
    null
    (当然是在C#code中)。您能提供SP返回的内容吗?可能出现异常?不能对
    NULL
    使用常用的相等或不相等运算符。这将不起作用:
    如果(@id\u subject4null)
    。相反,您需要检查