如何在C#中使用带有动态参数的INSERT INTO SQL查询?
您好,我有一个在SQL中保存一些数据的方法,但有时并不是每个参数都被设置,这给了我一个异常,因为它为NULL 以下是我的方法:如何在C#中使用带有动态参数的INSERT INTO SQL查询?,c#,sql,visual-studio,C#,Sql,Visual Studio,您好,我有一个在SQL中保存一些数据的方法,但有时并不是每个参数都被设置,这给了我一个异常,因为它为NULL 以下是我的方法: public string getBookingURL(string guid, BookingRequest request, string token, out string exitURL) { if (validateToken(token)) { string command = "INSER
public string getBookingURL(string guid, BookingRequest request, string token, out string exitURL)
{
if (validateToken(token))
{
string command = "INSERT INTO OUTLOOKADDIN (GUID, TOKEN, BOOKINGID, STARTUTC, ENDUTC, SUBJECT, NUMPARTICIPANTS) VALUES (@GUID, @TOKEN, @BOOKINGID, @STARTUTC, @ENDUTC, @SUBJECT, @NUMPARTICIPANTS)";
SqlConnection connection = new SqlConnection(GetConnectionString());
connection.Open();
try
{
SqlCommand cmd = new SqlCommand(command, connection);
cmd.Parameters.Add("@GUID", guid);
cmd.Parameters.Add("@TOKEN", token);
cmd.Parameters.Add("@BOOKINGID", request.bookingID);
cmd.Parameters.Add("@STARTUTC", request.startUTC);
cmd.Parameters.Add("@ENDUTC", request.endUTC);
cmd.Parameters.Add("@SUBJECT", request.subject);
cmd.Parameters.Add("@NUMPARTICIPANTS", request.numParticipants);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
cmd.Dispose();
cmd = null;
}
catch (Exception ex)
{
log.Error(ex.Message + "\n\rStackTrace:\n\r" + ex.StackTrace);
}
finally
{
connection.Close();
}
HttpContext current = HttpContext.Current;
string baseUrl = current.Request.Url.Scheme + "://"
+ current.Request.Url.Authority
+ current.Request.ApplicationPath.TrimEnd('/');
exitURL = baseUrl + "/index.html";
return baseUrl + '/'
+ "WebPage/Booking/BBooking.aspx?"
+ "OPS"
+ guid; ;
}
exitURL = null;
return null;
}
我认为这个SQL查询
string command=“插入到OUTLOOKADDIN(GUID、令牌、BOOKINGID、,
STARTUTC、ENDUTC、SUBJECT、NUMPARTICIPANTS)值(@GUID、@TOKEN、,
@BOOKINGID、@STARTUTC、@ENDUTC、@SUBJECT、@NUMPARTICIPANTS)”
。。。是否应动态运行,或者是否有其他解决方案阻止在参数为空时添加参数?您可以在前端添加验证以防止空值 或 可以在添加参数之前检查空值
if(value!=null)
{
cmd.Parameters.Add("@GUID", guid);
}
else
{
cmd.Parameters.Add("@GUID", "somestring or value");
}
您可以在前端添加验证以防止空值 或 可以在添加参数之前检查空值
if(value!=null)
{
cmd.Parameters.Add("@GUID", guid);
}
else
{
cmd.Parameters.Add("@GUID", "somestring or value");
}
除了的post之外,如果DB字段可以为空,请对空值使用DBNull.Value
编辑:在使用getBookingURL()方法之前,最好先检查这些值。如果在达到这一点之前进行适当的验证,那么就可以完全避免整个问题
if (/* date is null or not valid */)
cmd.Parameters.Add("@mydate", SqlDbType.DateTime).Value = DBNull.Value;
else
cmd.Parameters.Add("@mydate", SqlDbType.DateTime).Value = myDate;
除了的post之外,如果DB字段可以为空,请对空值使用DBNull.Value
编辑:在使用getBookingURL()方法之前,最好先检查这些值。如果在达到这一点之前进行适当的验证,那么就可以完全避免整个问题
if (/* date is null or not valid */)
cmd.Parameters.Add("@mydate", SqlDbType.DateTime).Value = DBNull.Value;
else
cmd.Parameters.Add("@mydate", SqlDbType.DateTime).Value = myDate;
如果db表中的字段不可计算,则必须验证前端的值并向用户显示警告
如果列可以为null,则可以将DBNull发送到数据库,它不会引发异常。我的解决方案是:
cmd.Parameters.AddWithValue("@ParameterName",
(a == null) ? (object)DBNull.Value : a);
如果db表中的字段不可计算,则必须验证前端的值并向用户显示警告
如果列可以为null,则可以将DBNull发送到数据库,它不会引发异常。我的解决方案是:
cmd.Parameters.AddWithValue("@ParameterName",
(a == null) ? (object)DBNull.Value : a);
你得到了什么异常?你能在数据库中将你的列设置为空吗?startutc日期应该在1900-2999之间,datetime为空我认为datetime不会接受null,对吗?无关提示:如果使用using(SqlCommand cmd=…){…}
,则无需调用cmd.Dispose()
和参数.Clear()
您遇到了什么异常?您可以在数据库中将列设置为可空吗?开始日期应该在1900-2999之间,datetime为空我认为datetime不会接受null,对吗?无关提示:如果使用using(SqlCommand cmd=…){…}
,则无需调用cmd.Dispose()
和Parameters.Clear()
当日期时间为空时,我可以做什么?例如,您可以在所有command.Parameters.Add中使用三元运算符,而不是>>cmd.Parameters.Add(“@ENDUTC”,request.ENDUTC==null”)
您可以使用>cmd.Parameters.Add(@ENDUTC),(request.ENDUTC==null)?(对象)DBNull.Value:request.endUTC)
类似地,如果您发现上述注释在某些方面很有用,您可以添加所有其他参数。当日期时间为空时,我可以做什么?例如,您可以在所有command.parameters.Add中使用三元运算符,而不是>>cmd.parameters.Add(“@ENDUTC”,request.ENDUTC)
您可以使用>>cmd.Parameters.Add(“@ENDUTC”,(request.ENDUTC==null)?(object)DBNull.Value:request.ENDUTC)代码>类似地,如果您发现上述注释在某些方面有用,您可以添加所有其他参数。我尝试了您的代码,即使我让datetime为空,它也会显示此日期:{01.01.0001 00:00:00}我如何在if语句中使用此参数?我尝试了您的代码,即使我让datetime为空,它也会显示此日期:{01.01.0001 00:00}我如何在if语句中使用它?