2013-11-26 100 views
-1

我有一个项目,由几个客户端使用,但其中一个使用SQL Server 2005无论任何代码运行一个SQL语句,其中包括像这样的日期:与日期字符串和SQL Server 2005的ASP.Net SQL字符串

" AND ABS.AbsenceDate = '" + DateTime.Now.ToString("yyyy-MM-dd") + "'"; 

我得到错误:varchar数据类型为datetime数据类型的转换导致超出范围的值

这仅发生于这一个客户机/服务器,如果我复制实际的sql字符串创建并在Sql Server中执行它在此服务器上运行正常。我创建了一个测试页面来确保日期字符串是正确的,并且确实按预期显示为2013-11-26。我的假设是,该应用程序发送的日期为2013-26-11,因为这会导致该问题,但随后测试表明否则会让我难倒。

有关信息,这是英文服务器上,以便在区域设置日/月/年和日期存储为年 - 月 - 日等

回答

2

不要连接字符串建立你的SQL字符串,但SQL-参数。主要原因是阻止sql-injection,但它也可以防止像这样的本地化或转换问题。

string sql = @"SELECT Columns 
       FROM dbo.tableName 
       WHERE ... 
       AND ABS.AbsenceDate = @AbsenceDate"; 

using(var con = new SqlConnection("ConnectionString")) 
using(var cmd = new SqlCommand(sql, con)) 
{ 
    cmd.Parameters.AddWithValue("@AbsenceDate", DateTime.Today); 
    con.Open(); 
    using(var reader = cmd.ExecuteReader()) 
    { 
     while(reader.Read()) 
     { 
      // ... 
     } 
    } 
} 
+0

值不是来自文本框或任何人可以进入。我在地方使用EF的ExecuteStoreQuery,因此无法使用参数。 – user1166905

+0

@ user1166905:我不熟悉它,但这个答案表明你可以:http://stackoverflow.com/questions/13035353/using-sql-server-named-parameters-with-executestorequery-and-executestorecommand除了认为今天用户不能改变它,但也许明天。另外,正如我所提到的,参数不仅可以防止sql注入,还可以解决其他问题,而且它们也更加高效(查询不会一直改变,系统可能会重新使用它)。 –

+0

那么,如果EF不能做到这一点,它会很糟糕,我会说,这仅仅是我不会使用它的原因。 –

-1

不用担心增加的安全性,Sql Parameters会自动解决您的问题。

该日期是否有日期部分或与它无关?

一个例子的解决办法是以下几点:

" AND ABS.AbsenceDate = Convert(DateTime, '" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "', 20) "' 
+0

为什么反对投票? – Ted

-1

我已经解决了这个问题,这个问题是什么很惊讶。我能够在管理工作室运行sql ok,但我使用Windows身份验证登录。我意识到我应该尝试使用应用程序使用的帐户,并在登录时这样做,我确实得到了错误。

发现设置帐户的人的语言设置为英国英语。我将其改为英文,并解决了瞧问题。

+0

好吧,你并没有真正解决问题。所有的代码应该工作,无论服务器cutlure。我的建议是总是使用sql参数并避免隐式数据类型转换 – Ted