【发布时间】:2018-01-14 14:43:34
【问题描述】:
sql server 上的存储过程是:
ALTER PROCEDURE [dbo].[sp_archive]
@p1 varchar(21)
AS
BEGIN
SET NOCOUNT ON;
SELECT * from audit where UpdateDate like '%@p1%'
END
UpdateDate 是一个 varchar(21) 字段。
在德尔福我有:
procedure TForm5.cxButton1Click(Sender: TObject);
begin
DataModule2.Archive.Params.ParamByName('p1').AsString := datetostr(cxDateEdit1.Date);
DataModule2.Archive.Prepare;
DataModule2.Archive.ExecProc;
end;
然而,如果我在 cxDateEdit1 中选择数据(日期)存在的日期 在审计表中,什么都没有显示。 如果我在 sql server 上运行查询:
select * from AUDIT where UpdateDate like '%30.12.2017%'
显示数据。 所以我猜 cxdataedit 显示的日期格式有问题。即使我将 cxdateedit 的显示和编辑格式更改为:dd.mm.yyyy 我仍然无法检索任何数据。我在这里缺少什么?
我也试过了:
DataModule2.Archive.Params.ParamByName('p1').AsString := cxDateEdit1.Text;
但无济于事......
【问题讨论】:
-
在您的存储过程中,您受到
%@p1%字符串字面的限制,而不是参数值。这与Delphi无关。 -
你试过
mm/dd/yyyy格式吗?这是 Sql Server 通常所期望的。 -
更安全的方法是指定日期大于或等于您想要的日期并且小于日期。
-
为什么以字符串格式而不是日期格式存储日期?通过将其转换为字符串,您只是使事情变得过于复杂。
-
不要,不要,不要,不要,不要,不要,不要:使用日期作为字符串。将它们存储为日期,使用日期值查询,将输入转换为
TDateTime值 a.s.a.p。你会为自己省去很多错误和错误。 (更不用说当用户喜欢不同的格式时避免问题。)
标签: sql-server delphi