为何数据无法显示?SQL Server存储过程与Delphi代码排障
解决SQL Server存储过程+Delphi数据无法显示的问题
咱们一步步拆解你遇到的问题,主要有三个核心点需要修复:
1. 存储过程中参数引用逻辑错误
你的存储过程里写了WHERE UpdateDate like '%@p1%',这里的@p1被包裹在字符串常量里,SQL Server会把它当成普通的文本内容(也就是去匹配包含"@p1"的UpdateDate值),根本不会解析成你传入的参数。正确的写法是把参数和通配符拼接起来:
ALTER PROCEDURE [dbo].[sp_archive] @p1 varchar(21) AS BEGIN SET NOCOUNT ON; -- 将参数与通配符拼接,让SQL正确识别参数 SELECT * from audit where UpdateDate LIKE '%' + @p1 + '%' END
2. Delphi端日期格式依赖系统设置,导致格式不匹配
datetostr()函数会跟着Windows系统的区域设置生成日期字符串,比如如果系统默认是mm/dd/yyyy格式,生成的字符串就和数据库里的dd.mm.yyyy完全不匹配,自然查不到数据。你得用FormatDateTime()指定固定格式,确保和数据库存储的UpdateDate格式一致:
procedure TForm5.cxButton1Click(Sender: TObject); begin // 指定固定日期格式,和数据库存储的格式对齐 DataModule2.Archive.Params.ParamByName('p1').AsString := FormatDateTime('dd.mm.yyyy', cxDateEdit1.Date); DataModule2.Archive.Prepare; // 这里还有个关键错误,继续看第三点 end;
3. Delphi端错误使用ExecProc获取结果集
ExecProc()是用来执行没有返回结果集的存储过程的(比如INSERT/UPDATE/DELETE这类操作),而你的存储过程是返回查询结果的,必须用Open()来打开数据集,绑定的控件才能拿到数据:
procedure TForm5.cxButton1Click(Sender: TObject); begin DataModule2.Archive.Params.ParamByName('p1').AsString := FormatDateTime('dd.mm.yyyy', cxDateEdit1.Date); DataModule2.Archive.Prepare; // 替换ExecProc为Open,才能获取查询结果 DataModule2.Archive.Open; end;
把这三个点都修复后,应该就能正常查询到对应日期的数据了。
内容的提问来源于stack exchange,提问作者user763539
相关产品推荐
相关产品推荐

