我有一个包含3列的表格,当闹钟响起时,我希望将该闹钟的时间存储在表格的第2列(AlarmActivated)中。然后,如果关闭该警报,它会将该时间存储在表的同一行中但存储在第3列中。这是我的代码:
String ConStr = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\\PatientHealthMonitor.mdf;Integrated Security=True;Connect Timeout=30";
String Query = " INSERT INTO AlarmResponse (AlarmActivated) VALUES" + (DateTime.Now.ToString());
SqlConnection Con = new SqlConnection(ConStr);
SqlCommand Command = new SqlCommand(Query, Con);
Con.Open();
Command.ExecuteReader();
Con.Close();
当值变为0时执行。
答案 0 :(得分:3)
ExecuteReader
会返回一些数据。由于您想要插入,您需要使用ExecuteNonQuery
代替。
不将DateTime
值存储为string
。将列类型更改为datetime2
,并将DateTime.Now
值直接传递给parameterized query。请阅读Bad habits to kick : choosing the wrong data type
同样使用DateTime.Now
可以是暧昧的。阅读Matt的文章The case against DateTime.Now
使用using
语句自动处理您的连接和命令,而不是手动调用Close
方法。
由于您只插入一列,因此其他两列将为null
或其默认值。
string ConStr = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\\PatientHealthMonitor.mdf;Integrated Security=True;Connect Timeout=30"
using(var Con = new SqlConnection(ConStr))
using(var Command = Con.CreateCommand())
{
Command.CommandText = "INSERT INTO AlarmResponse (AlarmActivated) VALUES (@alarm)";
Command.Parameters.Add("@alarm", SqlDbType.DateTime2).Value = DateTime.Now;
Con.Open();
Command.ExecuteNonQuery();
}
答案 1 :(得分:2)
问题在于
String Query = " INSERT INTO AlarmResponse (AlarmActivated) VALUES" + (DateTime.Now.ToString())
必须是
String Query = " INSERT INTO AlarmResponse (AlarmActivated) VALUES (" + DateTime.Now.ToString() + ")";
答案 2 :(得分:1)
使用了错误的函数,使用此函数:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery(v=vs.110).aspx ExecuteNonQuery
答案 3 :(得分:1)
首先,你的插入字符串很糟糕。您需要将括号放在引号内:
String Query = " INSERT INTO AlarmResponse (AlarmActivated) VALUES('" + DateTime.Now.ToString() +"')";
其次,您需要使用参数化查询,因为像这样构建SQL是一个不好习惯,可能会导致SQL注入攻击:
String ConStr = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\\PatientHealthMonitor.mdf;Integrated Security=True;Connect Timeout=30";
String Query = " INSERT INTO AlarmResponse (AlarmActivated) VALUES (@alarmTime)";
SqlConnection Con = new SqlConnection(ConStr);
SqlCommand Command = new SqlCommand(Query, Con);
Con.Open();
Command.Parameters.AddWithValue("@alarmTime", DateTime.Now);
Command.ExecuteNonQuery();
Con.Close();
最后,只有AlarmActivated列将设置一个值。其他两列将按其默认值填充。如果您希望其他两列的值不是默认值,则需要指定它们并提供值。
答案 4 :(得分:0)
您可以在SQL中创建2个存储过程,一个将插入行并返回@@ SCOPE_IDENTITY(您可以将其存储在列表<>中),您将将其用作更新过程的参数。
尽量避免在代码中使用SQL statemensts,以防止代码注入。