这就是我编写代码的方法,但错误在变量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());
}
答案 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,这也将匹配格式。