2011-09-29 82 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