我有以下SQL语句:
SELECT 420, DueDate, ISNULL(Amount, 0)
FROM Payments
WHERE CurveID = ? AND DueDate >= ?;这是我使用Delphi2010和TADODataset执行的。除了子句DueDate >= ?的计算不正确之外,该语句可以正确执行。如果我为第二个参数传入Date()或Now(),我会在DueDate字段中得到日期早于今天的返回值。
在SSMS中,如果我将date参数替换为格式为'2011-09-09‘的字符串,则可以成功运行此SQL查询:
SELECT 420, DueDate, ISNULL(Amount, 0)
FROM Payments
WHERE CurveID = 19 AND DueDate >= '2011-09-09';然而,回到Delphi语言中,即使我将参数值设置为这种格式的日期的字符串形式,也会得到不正确的结果(可能是因为TADODataset正确地将字符串转换回了日期)。
除了用硬编码到SQL中的日期构建动态SQL之外,我必须做什么才能正确地计算它?
发布于 2011-09-12 23:24:31
以下是我的问题的解决方案:
我使用TADOCommand对数据库执行SQL (而不是我在问题中错误地写成的TADODataset,oops)。切换到TADOQuery解决了这个问题。执行SQL接口在这两个类之间是不同的,并且TADOQuery明确地在dataset的parameters属性中查找它的参数。TADOCommand有一个Parameters属性,但也接受一个参数数组作为.Execute()方法的参数。
有了TQuery,我的参数就可以被正确地输入,而不需要我额外的努力。这适用于位置或命名参数。
发布于 2011-09-10 05:41:49
使用(命名的)参数,类似于
Query.CommandText := 'SELECT 420, DueDate, ISNULL(Amount, 0) FROM Payments '+
'WHERE CurveID = :CurveID AND DueDate >= :DueDate';
Query.Prepared := True;
Query.Parameters.ParamValues['CurveID'] := 19;
Query.Parameters.ParamValues['DueDate'] := EncodeDate(2011, 9, 9);
Query.Active := True;这也允许你在系统不正确的情况下设置参数的类型。
Query.Parameters.ParamByName('DueDate').DataType := ftDate;另请注意,ADODataSet的ParamCheck属性必须为true (默认值)才能使用:name样式参数。
发布于 2011-09-10 04:58:43
请尝试以下操作:
AND DueDate >= CONVERT(datetime,?);https://stackoverflow.com/questions/7367336
复制相似问题