後置程式手寫SqlDataSource程式新增日期格式之錯誤產生及解決

ADO.NET #3 (GridView + SqlDataSource)完全手寫、後置程式碼,兼論 SqlDataSource與UpdateParameter/DeleteParameter的用法

在學習以上程式碼的過程中,不斷出現錯誤訊息,一直無法新增成功,但失敗為成功之母,也讓我在使用SqlDataSource1.UpdateParameters還有日期處理上有了多一分認識。

在執行程式的過程,一直出現SqlDataSource.Update()有問題,錯誤訊息為「從字元字串轉換成日期及/或時間時,轉換失敗。」直覺是日期方面有問題,於是在日期資料上加了CData()轉換,但還是一樣,後來索性直接到MS SQL Server中去直接執行Update語法,發現在MS SQL Server中的錯誤訊息一模一樣。

我在ASP.NET (.NET Framework 4)的GridView中,ASP.NET很好心會幫我們進行文化轉換,即原資料庫中資料為「2002-08-01 00:00:00.000」,但你在畫面上看到的是「2002/8/1 上午 12:00:00」,所以程式碼:

' my_test_time.Text = "2002/8/1 上午 12:00:00"
SqlDataSource1.UpdateParameters.Add("test_time", my_test_time.Text)

問題出在這裡,這個「2002/8/1 上午 12:00:00」格式MS SQL Server看不懂,所以我就很直覺加上CDate()

' CDate(my_test_time.Text)輸出還是"2002/8/1 上午 12:00:00"
SqlDataSource1.UpdateParameters.Add("test_time", CDate(my_test_time.Text))

結果…還是錯,CDate()輸出格式還是「2002/8/1 上午 12:00:00」也就是說,CDate()還是會依文化特性來轉換,所以我們加上格式化輸出:

' 輸出格式 = 2002/8/1 12:00:00
SqlDataSource1.UpdateParameters.Add("test_time",CDate(my_test_time.Text).ToString("yyyy/MM/dd HH:mm:ss"))

程式總算正常了。

我在想,其他人為什麼沒碰到這個問題?我想比較可能的原因是MS SQL Server的版本不同,我使用的是比較新版MS SQL Server 2008 R2 (10.50.1600),所造成的結果。另外也可能是SqlDataSource1.UpdateParameters的小Bug,SqlDataSource1.UpdateParameters不像我們在使用像「SqlDataAdapter.UpdateCommand.Parameters.AddWithValue("@test_time", CDate(my_test_time.Text))」,SqlDataAdapter.UpdateCommand應該會自動幫你轉回正常的格式,讓MS SQL Server能接受,所以在使用SqlDataAdapter.UpdateCommand等相關程式時,也沒發這過這樣的錯誤,這部份我就沒深入研究。

結果就是,使用SqlDataSource1.UpdateParameters請小心「日期的格式」。

參考:
日期和時間格式字串

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。