2011-09-29 76 views
0

我想使我的SQLEXPRESS db INSERT命令並嘗試向我的日期時間列輸入值時收到錯誤。錯誤插入日期時間c#類型到SQL日期時間列

這是SQL命令我使用:

SqlDateTime sTime = new SqlDateTime(book.PublishedDate);     

string sql = string.Format("Insert into Books" + 
"(Name, PublishDate, IsInternal) Values" + 
"('{0}', '{1}', '{2}')", 
book.Name, sTime.Value, book.IsInternal); 

book.PublishedDate - 被DateTime類型 和PublishedDate列是SQL的DateTime

我收到以下錯誤: 一個varchar的轉化數據類型導致日期時間數據類型導致超出範圍值。

我該如何解決?

回答

2

使用參數化查詢。實際上,您可能正在使用的任何數據訪問技術都支持它們。而且它們允許您繼續將日期視爲日期,而不是將所有內容都轉換爲字符串。

E.g. (ADO.Net的SqlCommand)

SqlCommand cmd = new SqlCommand("Insert into Books (Name,PublishDate,IsInternal) Values (@Name,@PublishDate,@IsInternal)"); 
cmd.Parameters.Add(new SqlParameter("@Name", System.Data.SqlDbType.VarChar, 50)); 
cmd.Parameters.Add(new SqlParameter("@PublishDate", System.Data.SqlDbType.DateTime)); 
cmd.Parameters.Add(new SqlParameter("@IsInternal", System.Data.SqlDbType.Bit)); 

cmd.Parameters["@Name"].Value = book.Name; 
cmd.Parameters["@PublishDate"].Value = book.PublishedDate; 
cmd.Parameters["@IsInternal"].Value = book.IsInternal; 

誤差的最大來源的人做時,他們自己的客戶端代碼之間的報告數據類型的問題和SQL數據庫是在哪裏,無論出於何種原因,他們已經轉變一切字符串。這不僅通常效率較低,而且還依賴於至少兩次轉換(介於類型 - >字符串和字符串 - >類型)之間的正確發生,並且通常至少有一次轉換將留給任何默認轉換函數是。

+0

現在使用parametrised查詢時,我得到錯誤,而我對某些字段爲空值: 參數化查詢「(@Name爲nvarchar(57),@ PublishDate DATETIME,@ IsValid的位,@ IsApprov」需要參數「 @Author',這是沒有提供的 – kaycee

+0

@ kaycee - 我看不到你的代碼,我發佈的代碼到目前爲止幾乎完全等於你發佈到目前爲止的代碼 –

+0

我有一個字段在查詢是空的 cmd.Parameters [「@ Author」]。Value = book.Author; 如果book.Author == null,那麼我得到我剛剛提到的錯誤...它似乎沒有知道處理空值 – kaycee