2015-12-01 80 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狀態,以防止代碼注入。

相關問題