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)
。相反,您需要检查