【问题标题】:C# Conversion failed when converting date and/or time from character with a date time picker使用日期时间选择器从字符转换日期和/或时间时,C# 转换失败
【发布时间】:2020-01-17 21:09:55
【问题描述】:

我正在创建一个图书馆管理系统。 对于日期,我有一个日期选择器,在单击按钮保存后,它会引发此错误:

System.Data.SqlClient.SqlException: '从字符串转换日期和/或时间时转换失败。'

这是错误所在:

cmd.CommandText = "insert into books_info values('"
                  + textBox1.Text        + "', '"
                  + textBox2.Text        + "', '"
                  + textBox3.Text        + "', '"
                  + dateTimePicker1.Text + "', "
                  + textBox5.Text        + ", "
                  + textBox6.Text        +
                ")";

【问题讨论】:

  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入 - 查看Little Bobby Tables
  • 日期/时间选择器的文本版本不能被数据库直接转换。例如,dateTimePicker1.Text 值可能看起来像“2020 年 1 月 17 日”,而数据库需要像“01/17/2020”这样的格式
  • 永远不需要转换DateTimePicker 选择。 DateTimePicker.Value DateTime 类型
  • 您能否编辑您的问题并为我们提供dateTimePicker1.Text 评估结果的示例?
  • 另外,用适当的数据库标记它(我假设它是 SQL Server,但它可能是......其他任何东西。DB2?Oracle?其他东西?)

标签: c#


【解决方案1】:

这样的事情会更安全,也可能会修复你的错误:

string commandText = "insert into books_info values(@val1, @val2, @val3, @val4, @val5, @val6)";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(commandText, connection);
    command.Parameters.AddWithValue("@val1", textBox1.Text);
    command.Parameters.AddWithValue("@val2", textBox2.Text);
    command.Parameters.AddWithValue("@val3", textBox3.Text);
    command.Parameters.AddWithValue("@val4", dateTimePicker1.Value);
    command.Parameters.AddWithValue("@val5", textBox5.Text);
    command.Parameters.AddWithValue("@val6", textBox6.Text);

    //OR DO THIS INSTEAD. SEE COMMENTS ON WHY AddWithValue IS NOT ALWAYS THE BEST CHOICE. 
    //FOR THIS, THE SQL TYPES AND FIELD LENGTHS SHOULD MATCH WHAT YOU ARE USING IN YOUR 
    //  DATABASE AND APPLICATION.
    command.Parameters.Add("@val1", SqlDbType.NVarChar, 64).Value = textBox1.Text;
    command.Parameters.Add("@val2", SqlDbType.NVarChar, 64).Value = textBox2.Text;
    command.Parameters.Add("@val3", SqlDbType.NVarChar, 64).Value = textBox3.Text;
    command.Parameters.Add("@val4", SqlDbType.DateTime).Value = dateTimePicker1.Value;
    command.Parameters.Add("@val5", SqlDbType.NVarChar, 64).Value = textBox5.Text;
    command.Parameters.Add("@val6", SqlDbType.NVarChar, 64).Value = textBox6.Text;

    try
    {
        connection.Open();
        command.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

【讨论】:

  • @JohnWu 很高兴知道。谢谢你。我很少写这样的手动数据库连接,但我会做一个说明,尽可能避免使用 AddWithValue。
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 2012-04-17
  • 2017-12-07
相关资源
最近更新 更多