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

时间:2014-09-25 19:00:53

标签: c# sql sql-server datetime

我的应用程序有两个文本框,用户可以选择输入日期。如果没有日期,那么我想将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 ---

1 个答案:

答案 0 :(得分:0)

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

    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);