以下代码有什么问题?将日期和时间存储到sql server中的datetime字段中。
private void button1_Click(object sender, EventArgs e)
{
string d = DateTime.Now.ToShortDateString();
cmd.CommandText = "insert into trans values("+label9.Text+",'d');";
cmd.Connection = con;
con.Open();
int x= cmd.ExecuteNonQuery();
MessageBox.Show("Attendance recorded succesfully");
答案 0 :(得分:4)
这是一种非常糟糕的方法,因为它打开了sql注入。你最好使用SqlParameter。
cmd.CommandText="insert into trans values(@label, @date)";
cmd.Parameters.AddWithValue("label", int.Parse(label9.Text));
cmd.Parameters.AddWithValue("date", DateTime.Now);
cmd.Connection = con;
con.Open();
int x= cmd.ExecuteNonQuery();
答案 1 :(得分:2)
CommandText
字符串中有错误输入。请改用
cmd.CommandText="insert into trans values("+label9.Text+","+DateTime.Now.ToString()+");";
修改强>
完整编辑的代码将是这样的。请注意,using
语句会关注处理您的更新,但此代码仍然很糟糕且是 sql-injections 的内容。如果您想要安全的代码,则必须使用参数。
private void button1_Click(object sender, EventArgs e)
{
using (System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection("Data Source=localhost; Initial Datalog=myDatabase; Integrated Security=TRUE;"))
{
using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand("insert into trans values("+label9.Text+","+DateTime.Now.ToString()+");", connection))
{
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
}
}
答案 2 :(得分:1)
除了使用内联SQL之外,这很糟糕。您应该在查询中使用@param1
语法,然后向其添加参数(因此也可以回避此问题)。更好 - 使用像Linq到Sql或Entity Framework(或者nHibernate或其他)的ORM。
SQL Server通常希望它是yyyymmdd格式的时间,而且你真的应该检查标签的值确实是一个整数,并且只运行查询:
int labelValue = 0;
if(int.TryParse(label9.Text, out labelValue))
{
cmd.CommandText="insert into trans values("+ labelValue +
", '" + DateTime.Now.ToString("yyyyMMdd");"')";
cmd.Connection = con;
con.Open();
int x= cmd.ExecuteNonQuery();
MessageBox.Show("Attendance recorded succesfully");
}
我还说你真的需要检查你对连接/命令的使用 - 你在哪里Dispose
?从这段代码来看,我猜你没有?
总而言之,即使有了这些修正,我也不建议你这样做 - 按照Harm建议的方式做到 - +5(或更多)是应得的。