DELPHI中调用带有日期型参数的存储过程
- SQL code
CREATE PROCEDURE 合计@date1 datetime,@date2 datetimeAS select top 20 a.物料代码,sum(a.总数量)as 数量合计,sum(a.总金额)as 金额合计,a.物料名称,a.型号 from(SELECT dbo.sbilldet.itemno AS 物料代码, SUM(dbo.sbilldet.qty) AS 总数量 , SUM(dbo.sbilldet.sellsum) AS 总金额, dbo.itemdata.itemname AS 物料名称, dbo.itemdata.descript AS 型号,dbo.sbillmst.carddt as 日期FROM dbo.sbilldet INNER JOIN dbo.sbillmst ON dbo.sbilldet.sysno = dbo.sbillmst.sysno INNER JOIN dbo.enterprise ON dbo.sbillmst.compno = dbo.enterprise.compno INNER JOIN dbo.itemdata ON dbo.sbilldet.itemno = dbo.itemdata.itemnoGROUP BY dbo.sbilldet.itemno, dbo.itemdata.itemname, dbo.itemdata.descript, dbo.sbillmst.carddt, dbo.sbillmst.ischeckHAVING (SUM(dbo.sbilldet.qty) >= 0) AND (dbo.sbillmst.ischeck = 1) AND (dbo.sbillmst.carddt >=@date1 AND dbo.sbillmst.carddt <= @date2)) agroup by a.物料代码,a.物料名称,a.型号order by 数量合计 descGO
---------------------
- Delphi(Pascal) code
procedure TForm1.Button1Click(Sender: TObject);begin if datetimepicker1.Date >datetimepicker2.Date then begin showmessage('开始日期大于终止日期'); datetimepicker1.SetFocus ; exit; end; adoquery1.Close; adoquery1.sql.Clear; adoquery1.SQL.text:='execute 合计 (:date1,:date2)'; adoquery1.Parameters.ParamByName('@date1').value:=DateTimePicker1.DateTime; adoquery1.Parameters.ParamByName('@Date2').Value:=DateTimePicker2.DateTime; adoquery1.ExecSQL; adoquery1.refresh;end;
运行后提示Adoquery1:parameter '@date1' not found
试了很多次都不行。请教各位该怎么解决?
[解决办法]
参数应该是date1,而不是@date1
[解决办法]
使用存储过程前,先要创建参数
用ADOQuery1.Parameters.CreateParameter去创建
[解决办法]
关键看什么数据库,可以把数据库当中的日期转换为字符串进行比较等,一般数据库也都支持字符串的日期写入。当然也可以写timestamp格式。比如Microsoft所能识别的包括ODBC在内支持的
日期:{d 'yyyy-mm-dd'}
时间:{t 'hh:mm:ss[.fff]'}
timestamp:{ts 'yyyy-mm-dd hh:mm:ss[.fff]'}
又比如db2所识别的: timestamp('yyyy-mm-dd-hh.mm.ss.zzzzzz')