无法从C#向datetime sql发送日期或null

本文关键字:日期 null sql datetime | 更新日期: 2023-09-27 18:24:37

我有一个应用程序,它有两个文本框,用户可以选择输入日期。如果没有日期,那么我想将null发送到sql。我有这个:

我解析DateTime值的代码如下:

    if (ScheduledTextBox.Text == "") //Schedule Date
    {
        sqlCmd.Parameters.Add("@ScheduledDT", SqlDbType.DateTime).Value = DBNull.Value;
    }
    else
    {
        sqlCmd.Parameters.AddWithValue("@ScheduledDT", SqlDbType.DateTime).Value = 
            DateTime.Parse(ScheduledTextBox.Text);
    }
    if (SourceDTTextbox.Text == "") //Source Date
    {
        sqlCmd.Parameters.Add("@SourceDT", SqlDbType.DateTime).Value = DBNull.Value;
    }
    else
    {
        sqlCmd.Parameters.Add("@SourceDT", SqlDbType.DateTime).Value = 
            DateTime.Parse(SourceDTTextbox.Text);
    }

这返回一个错误:

字符串未被识别为有效的DateTime

在我的数据库中,ScheduledDT属于(datetime, null)类型。

当我输入我认为有效的DateTime时,也会发生这种情况,例如

   2014-09-25 13:59:29

堆栈跟踪:

    A first chance exception of type 'System.FormatException' occurred in System.Data.dll
    System.FormatException: Failed to convert parameter value from a String to a DateTime. --->         System.FormatException: String was not recognized as a valid DateTime.
   at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
   at System.Convert.ToDateTime(String value, IFormatProvider provider)
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType,   Boolean& coercedToDataFeed, Boolean& typeChanged, Boolean allowStreaming)
   --- End of inner exception stack trace ---

无法从C#向datetime sql发送日期或null

我没有在电脑上测试这个,但看起来你的问题是这行:

    sqlCmd.Parameters.AddWithValue("@ScheduledDT", SqlDbType.DateTime).Value = 
        DateTime.Parse(ScheduledTextBox.Text);

它应该看起来更像这样:

DateTime myObject = DateTime.Parse(ScheduledTextBox.Text);
sqlCmd.Parameters.AddWithValue("@ScheduledDT", myObject);

看起来您传入的是对象类型,而不是实际对象。

编辑:您也可以使用Parameters.Add而不是Parameters.AddWithValue…

  sqlCmd.Parameters.Add("@ScheduledDT", SqlDbType.DateTime).Value = 
        DateTime.Parse(ScheduledTextBox.Text);