如何在C#中使用带有动态参数的INSERT INTO SQL查询?

如何在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

您好,我有一个在SQL中保存一些数据的方法,但有时并不是每个参数都被设置,这给了我一个异常,因为它为NULL

以下是我的方法:

 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语句中使用它?