2012-04-18 45 views
0

我有用于从数据库中检索数据以下行代码:如何使用日期和时间变量查询数据库?

DataTable newEquipmentTable = database.Connection.RetrieveData(database.AdapterType, string.Format("SELECT ID FROM Equipment WHERE Name = '{0}' AND CreatedOn = '{1}'", equipment.Name, equipment.CreatedOn.ToString("yyyy-MM-dd HH:mm:ss.fff"))); 

它返回一个错误说“varchar数据类型到datetime数据类型的转换导致外的范围内的值”

当我进行直接咨询时,使用以下查询将返回预期结果。

SELECT ID FROM Equipment WHERE Name = 'aa' AND CreatedOn = '2012-04-17 19:42:49.650' 

我在做什么错?

+3

注意SQL注入。设备的价值是什么?创造了什么? – Mr47 2012-04-18 13:13:14

+0

这是一个值'2012-04-17 19:42:49.650' – 2012-04-18 13:14:25

+2

你不能使用'正确的'参数查询吗? – 2012-04-18 13:14:54

回答

0

请注意,SQL的datetime类型不能保存1753-01-01之前的值。

只有使用调试器检查SQL字符串,然后才能查询数据库以查找问题。

但是,最好的办法是使用参数化查询(如this example);否则你很容易受到SQL Injection的影响。

+0

这就是问题所在! 我的咨询是在SQL的permited之前返回一个日期。 – 2012-04-18 13:43:10

+0

我很高兴解决了它!另外,请尽量避免编写参数化查询;通过连接字符串构建SQL语句可能会导致SQL注入漏洞,这可能会给您带来很大麻烦。 – GolfWolf 2012-04-18 13:47:33

2

您正在传递String值来选择datetime字段。所以,你需要将其转换为datetime第一:

Convert(datetime,'2012-04-17 19:42:49.650', 102) 

除此之外,你可能会打开SQL-Injection为@ Mr47提到,使用SqlParameters

+0

RetrieveData需要一个字符串查询,所以我需要传递一个字符串作为参数,而不是日期时间。 – 2012-04-18 13:45:47

+0

@GuilhermeCampos:这就是为什么我展示了如何将字符串转换为dbms端的datetime。您可以将'String.Format(“Convert(datetime,{0},102)”,equipment.CreatedOn.ToString(“yyyy-MM-dd HH:mm:ss.fff”))'传递给'RetrieveData'。 – 2012-04-18 13:53:19

0

equipment.CreatedOn的价值是多少?

我认为在sql-server或您的应用程序中的文化设置问题。它不能直接隐藏你的日期。用户文化设置将解决问题。

相关问题