You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何数据无法显示?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:27:31