2009-08-12 50 views
1

更新無法正常工作。在.NET中更新難度

sqlstr ="UPDATE emp SET bDate='"+Convert.ToDateTime(txtbDate.Text)+"'"; 

無法更新emp表。 我也嘗試使用Parse方法。 它引發錯誤消息: 將char數據類型轉換爲日期時間數據類型導致超出範圍的日期時間值。該語句已終止。

+0

只是一個有趣的筆記;如果您的格式採用以下格式:YYYY-MM-DD HH:MM:SS(例如2009-08-12 12:27:50),SQL Server將始終正確解析它,無論您的區域設置如何。 – 2009-08-12 10:28:12

+1

請參閱爲什麼參數是你的朋友:http://stackoverflow.com/questions/1263125/how-does-sql-query-parameterisation-work/1263142#1263142 – Eric 2009-08-12 12:12:56

回答

4

當接受用戶的輸入時,你應該總是使用sql參數。這可能會解決您的問題,並提高安全性。試試這個:

sqlstr ="UPDATE emp SET [email protected]"; 
SqlCommand.Parameters.AddWithValue("@bDate", Convert.ToDateTime(txtbDate.Text)); 
+2

我同意參數化,但會建議不使用.AddWithValue因爲它可能不像您期望的那樣行爲,因爲您實際上並未指定基礎數據類型。例如http://chrisrickard.blogspot.com/2007/06/addwithvalue-is-evil.html – AdaTheDev 2009-08-12 10:39:26

-1

它應該是簡單的字符串,因爲你把它保存在一個sqlstr;)

2

您可以使用參數化的存儲過程。

.net datetime包含比SQL DateTime更多的值,因此超出範圍錯誤。

參數化的存儲過程還提供了更多的安全性來防範SQL注入攻擊。

2

你可以殺死2個一箭雙鵰和使用參數:

UPDATE emp SET [email protected] 

,並填寫直接一個日期參數值,使用DateTime.Parse()做轉換。這也消除了您現在的SQl注射問題。

3

不要使用即席SQL這樣的,使用參數化的SQL:

sqlstr = "UPDATE emp SET [email protected] WHERE...." 

然後在你的SqlCommand,添加@NewDate參數:

YourSqlCommand.Parameters.Add("@NewDate", SqlDbType.DateTime); 
YourSqlCommand.Parameters["@NewDate"].Value = Convert.ToDateTime(txtbDate.Text); 
0

使用參數日期傳遞給查詢 這個,如果你正在使用OLE DB:

sqlstr = "UPDATE emp SET bDate=? " 
command.Parameters.Add(New OleDbParameter("@bDate", Convert.ToDateTime(txtbDate.Text))) 
1

你嘗試將日期值解析爲SQL格式(yyyy-MM-dd),例如2000-12-31

Convert.ToDateTime(txtbDate.Text).ToString("yyyy-MM-dd"); 

乾杯。

+0

我會盡快用參數化查詢測試您的解決方案。 但Convert.ToDateTime(txtbDate.Text).ToString(「yyyy-MM-dd」)完美地工作。 我試了半天以上。 謝謝dkartopr 謝謝全部 – Dejene 2009-08-12 10:44:45

0

「將char數據類型轉換爲日期時間數據類型導致超出範圍的日期時間值,該語句已終止。」

你的日期時間不在SQL DateTime接受的範圍內。你想要分析什麼日期?我有一些真的很早的錯誤(例如1/15/103)。日期存儲在任意起點的滴答中。

for .NET的起點是1/1/0001
對SQL的起點是1753年1月1日

我不知道最終值。嘗試運行這些並進行比較。代碼跟蹤或控制檯寫入線。

DateTime netDate = DateTime.MinValue;
SqlDateTime sqlDate = SqlDateTime。MINVALUE; DateTime netMaxDate = DateTime.MaxValue;
SqlDateTime sqlMaxDate = SqlDateTime.MaxValue;

閱讀其他人對參數化查詢的看法。

+0

這是爲什麼downvoted?這直接解決了他的實際錯誤(由於日期時間超出範圍而導致轉換失敗) – 2009-08-12 12:29:20