2015-12-01 42 views
1

我有一个带有3列的表格,当警报熄灭时,我希望将该警报的时间存储在表格的第二列(AlarmActivated)中。那么,如果警报将被关闭,它存储在同一行的表在那个时间,但在第3列。这是我的代码:将信息发送到数据库中的特定列C#

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

你有没有遇到特定问题? – user1666620

+0

您无法多次插入同一行。您尝试先插入,然后用其uniqueID更新其他2列。您需要清楚地描述表格,以便我们可以清楚地了解您想要的内容 –

+0

@MohanPrasath您可以清楚地看到问题不在于描述表格,而是在构建他的查询字符串时他错过了关闭'“)” ' – MethodMan

回答

3

执行ExecuteReader返回一些数据。既然你想插入,你需要使用ExecuteNonQuery

And do 不是将您的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(); 
} 
+0

我没有开发数据库,​​但是我已经将它更改为datetime2,谢谢! –

+1

由于这个答案涉及到坏习惯纠正...与Soner提到的有关您的datetime列的内容一样,您似乎直接通过了DateTime.Now。如果这是一个用户在保存之前不会操作的字段,我建议不要从UI传递值。使用DBMS的内置日期/时间函数来生成一个值来存储:'INSERT INTO AlarmResponse(AlarmActivated)VALUES(CURRENT_TIMESTAMP);' – gmiley

+0

@gmiley这也是另一种选择,但AFAIK,'CURRENT_TIMESTAMP'易受攻击时区_weirdness_作为'DateTime.Now',因为它派生出这个sql实例正在运行的计算机,并且它可以在不同的地方有不同的_meaning_。使用UTC时间并存储它们是更好的方法或过程。 –

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列会设置一个值。其他两列将填入它们的默认值。如果您希望其他两列具有非默认值,则需要指定它们并提供一个值。

+0

告诉我有一个无效的列名,但在查看我的表时AlarmActivated是列的名称。编辑:我的数据库人用两个e命名它的-_- –

2

的问题是在

String Query = " INSERT INTO AlarmResponse (AlarmActivated) VALUES" + (DateTime.Now.ToString()) 

它必须是

String Query = " INSERT INTO AlarmResponse (AlarmActivated) VALUES (" + DateTime.Now.ToString() + ")"; 
0

可以在SQL创建2个存储过程,一个将插入一行并返回@@ SCOPE_IDENTITY(你可以将其存储在列表<>),您将用它作为更新过程的参数。

尽量避免在代码中使用SQL状态,以防止代码注入。

相关问题