如何将日期时间选择器中的日期值转换为Visual C#中SQL Server表中的Date列?

时间:2015-06-13 05:54:45

标签: c# visual-studio-2013

这就是我编写代码的方法,但错误在变量dob中。它表示将日期从字符转换为字符串时转换失败。

try
{
    DialogResult dr = MessageBox.Show("Are you sure you want to update data?", "Confirm?", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);

    if (dr == DialogResult.Yes)
    {
        int Stu_id = Convert.ToInt32(Stu_DataGrid.CurrentRow.Cells[0].Value.ToString());

        con.Open();
        string query = "Update tb_Student set Stu_Name = '"+name+"', Stu_DOB = '"+dob+"', Age = '"+age+"', Stu_Address = '"+Address+"', Stu_Tel_no = '"+telno+ "' Where Student_ID = '" + Stu_id + "'";

        MessageBox.Show(query); //This is to see whether the query is correct

        com = new SqlCommand(query, con);

        line = com.ExecuteNonQuery();
        com.Dispose();
        con.Close();

        if (line > 0)
        {
            loadGridData();
            ClearData();
            MessageBox.Show("Student with ID " + Stu_id + " updated successfully!", "Updated", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
        else
            MessageBox.Show("Update Failed", "Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
}

2 个答案:

答案 0 :(得分:4)

简单的答案:不要。

让ADO.NET为您完成并同时保护您的代码免受SQL注入by using parameters

更改您的查询以使用变量@dob,然后使用:

com.Parameters.AddWithValue("@dob", dob);

您也应该为所有参数执行此操作 - 而不是连接字符串。

阅读材料:

答案 1 :(得分:1)

无法查看dob的数据类型。如果是日期,您可以使用以下内容来避免SQL Server中的日期格式问题:

dob.ToString("yyyy-MM-dd")

它是一种更通用的格式,无法被误解,因为它始终是明显的,即月份和哪一天,尽管en-US设置或en-GB默认为数据库中。

您应该使用SqlParameters来避免SQL注入。如果您愿意使用它,您就不必自己将日期转换为可理解的字符串格式。

如果dob是直接来自控件的字符串,则应首先使用DatePicker中的DateFormat将字符串转换为DateTime。如果您最初设置了自定义DateFormat,这也将匹配格式。