将信息发送到数据库C#中的特定列

时间:2015-12-01 14:12:38

标签: c# database

我有一个包含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时执行。

5 个答案:

答案 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)

答案 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,以防止代码注入。