将 C# 日期时间发送到 SQL Server - 错误“从字符串转换日期和/或时间时转换失败”

Posted

技术标签:

【中文标题】将 C# 日期时间发送到 SQL Server - 错误“从字符串转换日期和/或时间时转换失败”【英文标题】:Send C# datetime to SQL Server - error "Conversion failed when converting date and/or time from character string" 【发布时间】:2019-08-31 09:41:42 【问题描述】:

我正在尝试提交一个包含一些日期时间选择器以及其他控件的表单。其他控件没有问题,但是当我将 datetimepicker 日期值放入参数化的插入语句中时,会发生此错误:

从字符串转换日期和/或时间时转换失败

我尝试了以下方法:

    自定义日期时间格式:

    dateTimePicker1.Format = DateTimePickerFormat.Custom;
    dateTimePicker1.CustomFormat = "dd/MM/yyyy";'  
    

    使用 datetime.parseexact、datetime.parse 和 Convert.ToDateTime 将其转换为字符串,然后转换为日期时间。

    也尝试过这种类型的代码:

    DateTime date2 = Convert.ToDateTime(dateTimePicker2.Text);
    

完整代码

con.Open();

string s = "insert into [NutritionClinicDatabase].[dbo].[PatientInformation] values(@NIC, @ClinicNo, @PatientCategory, @Date, @Name, @Gender, @DOB, @DateOfAdmission, @DateOfDischarge, @DurationOfVisit, @Age, @City, @Contact, @Height, @Weight, @UsualWweight, @ReferredUnit, @WC, @FatMass, @LeanBodyMass, @HandGripStrength, @Intake, @Illness, @Illness2, @Illness3, @Illness4, @Specify, @Other)";


cmd = new SqlCommand(s, con);
String strDateFormat = "yyyy-MM-dd";
cmd.Parameters.AddWithValue("@NIC", NIC);
cmd.Parameters.AddWithValue("@ClinicNo", ClinicNo);
cmd.Parameters.AddWithValue("@PatientCategory", PatientCategory);

if (PatientCategory == "Clinic Patient")

    cmd.Parameters.AddWithValue("@Date", SqlDbType.Date).Value = dateTimePicker1.Value.Date;

else if ((PatientCategory == "In-Ward Patient") || (PatientCategory == "ICU Patient"))

    cmd.Parameters.AddWithValue("@Date", DBNull.Value);


cmd.Parameters.AddWithValue("@Name", Name1);
cmd.Parameters.AddWithValue("@Gender", Gender);

//if (dateTimePicker2.CustomFormat == " ")
//    cmd.Parameters.AddWithValue("@DOB", DBNull.Value);
//else
cmd.Parameters.AddWithValue("@DOB", SqlDbType.Date).Value = dateTimePicker2.Value.Date;
// cmd.Parameters.AddWithValue("@DOB", SqlDbType.Date).Value = dateTimePicker2.Value.Date;

if ((PatientCategory == "In-Ward Patient") || (PatientCategory == "ICU Patient"))

    //if (dateTimePicker3.CustomFormat == " ")
    //    cmd.Parameters.AddWithValue("@DateOfAdmission", DBNull.Value);
    //else
    cmd.Parameters.AddWithValue("@DateOfAdmission", SqlDbType.Date).Value = dateTimePicker3.Value.Date;
    // cmd.Parameters.AddWithValue("@DOB", SqlDbType.Date).Value = dateTimePicker2.Value.Date;
    //if (dateTimePicker4.CustomFormat == " ")
    //    cmd.Parameters.AddWithValue("@DateOfDischarge", DBNull.Value);
    //else
    cmd.Parameters.AddWithValue("@DateOfDischarge", SqlDbType.Date).Value = dateTimePicker4.Value.Date;
    //cmd.Parameters.AddWithValue("@DateOfDischarge", DateTime.Parse(dateTimePicker4.Value.Date.ToString()));
    // cmd.Parameters.AddWithValue("@DOB", SqlDbType.Date).Value = dateTimePicker2.Value.Date;

    cmd.Parameters.AddWithValue("@DurationOfVisit", Duration);

else if (PatientCategory == "Clinic Patient")

    cmd.Parameters.AddWithValue("@DateOfAdmission", DBNull.Value);
    cmd.Parameters.AddWithValue("@DateOfDischarge", DBNull.Value);
    cmd.Parameters.AddWithValue("@DurationOfVisit", "Not Specified");


cmd.Parameters.AddWithValue("@Age", Age);
cmd.Parameters.AddWithValue("@City", City);
cmd.Parameters.AddWithValue("@Contact", Contact);
cmd.Parameters.AddWithValue("@Height", Height1);
cmd.Parameters.AddWithValue("@Weight", Weight);
cmd.Parameters.AddWithValue("@UsualWweight", UsualWeight);
//cmd.Parameters.AddWithValue("@CurrentWeight", CurrentWeight);
cmd.Parameters.AddWithValue("@ReferredUnit", ReferredUnit);
cmd.Parameters.AddWithValue("@WC", WC);
cmd.Parameters.AddWithValue("@FatMass", FatMass);
cmd.Parameters.AddWithValue("@LeanBodyMass", LeanBodyMass);
cmd.Parameters.AddWithValue("@HandGripStrength", HandGripStrength);
cmd.Parameters.AddWithValue("@Intake", Intake);
cmd.Parameters.AddWithValue("@Illness", Illness);
cmd.Parameters.AddWithValue("@Illness2", Illness2);
cmd.Parameters.AddWithValue("@Illness3", Illness3);
cmd.Parameters.AddWithValue("@Illness4", Illness4);
cmd.Parameters.AddWithValue("@Specify", Specify);
cmd.Parameters.AddWithValue("@Other", Other);

cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();

con.Close();

MessageBox.Show("Patient Registered");

【问题讨论】:

最好避免AddWithValue 【参考方案1】:

您没有正确使用AddWithValue。 AddWithValue method 采用参数名称和作为参数值的对象,而不是类型。我建议你使用avoid AddWithValue entirely 而不是使用Add 方法,例如:

cmd.Parameters.Add("@Date", SqlDbType.Date).Value = dateTimePicker1.Value.Date;

【讨论】:

等我去办公室再来试试。

以上是关于将 C# 日期时间发送到 SQL Server - 错误“从字符串转换日期和/或时间时转换失败”的主要内容,如果未能解决你的问题,请参考以下文章

c# SQL Server:日期时间数据类型

如何从 C# ASP.NET 参数将希伯来语文本发送到 SQL Server?

在 C# 中将十六进制值从 SQL Server 转换为日期时间

将 XML 从 C# 传递到 SQL Server

SQL Server 日期格式不适用于存储过程

Microsoft SQL Server 数据库/Visual Studio C#:日期处理