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

Delphi中适用于SQL Server的数据库访问技术是否支持数组作为预准备语句参数?

Delphi中针对SQL Server支持数组作为预准备语句IN子句参数的方案

1. FireDAC(Embarcadero官方框架)

FireDAC是Delphi自带的主流数据库访问框架,原生支持将数组作为参数绑定到IN子句,无需额外配置,会自动处理与SQL Server的参数交互,兼顾易用性与性能。

示例代码:

var
  PeriodArray: TArray<string>;
begin
  // 定义要传入的数组值
  PeriodArray := ['2023Q1', '2023Q2', '2023Q3'];
  
  FDQuery.SQL.Text := 'SELECT * FROM SOMETABLE WHERE Period IN (:Periods)';
  
  // 配置参数类型并绑定数组
  with FDQuery.ParamByName('Periods') do
  begin
    DataType := ftString;
    SetArray(0, Length(PeriodArray) - 1, PeriodArray);
  end;
  
  FDQuery.Open;
end;

FireDAC会根据参数类型自动选择最优绑定方式(如展开为多个参数或使用SQL Server表值参数)。

2. ADO(Delphi原生组件)

ADO本身不直接支持数组参数,但可借助SQL Server的**表值参数(Table-Valued Parameter)**实现类似效果,需先在SQL Server端定义表类型:

步骤1:在SQL Server创建用户定义表类型

CREATE TYPE dbo.PeriodList AS TABLE (Period VARCHAR(10) NOT NULL)

步骤2:Delphi代码实现

var
  ADOCmd: TADOCommand;
  TableParam: TADOParameter;
  RS: _Recordset;
begin
  ADOCmd := TADOCommand.Create(nil);
  try
    ADOCmd.Connection := ADOConnection1;
    ADOCmd.CommandText := 'SELECT s.* FROM SOMETABLE s ' +
                          'INNER JOIN @Periods p ON s.Period = p.Period';
    
    // 添加表值参数
    TableParam := ADOCmd.Parameters.Add('@Periods', adUserDefined, adParamInput);
    TableParam.Properties['Type Name'].Value := 'dbo.PeriodList';
    
    // 创建包含数组数据的RecordSet
    RS := CoRecordset.Create;
    RS.Fields.Append('Period', adVarChar, 10);
    RS.Open;
    
    // 向RecordSet添加数据
    RS.AddNew; RS.Fields['Period'].Value := '2023Q1';
    RS.AddNew; RS.Fields['Period'].Value := '2023Q2';
    
    // 绑定参数值
    TableParam.Value := RS;
    
    // 执行查询
    ADOCmd.Execute;
  finally
    RS := nil;
    ADOCmd.Free;
  end;
end;

3. UniDAC(第三方商业框架)

UniDAC是Devart推出的跨数据库访问框架,对SQL Server的数组参数支持友好,用法简洁:

示例代码:

var
  PeriodArray: TArray<string>;
begin
  PeriodArray := ['2023Q1', '2023Q2'];
  
  UniQuery.SQL.Text := 'SELECT * FROM SOMETABLE WHERE Period IN (:Periods)';
  UniQuery.ParamByName('Periods').AsArray := PeriodArray;
  
  UniQuery.Open;
end;

UniDAC会自动适配SQL Server的参数机制,无需手动处理参数展开或表类型定义。


内容的提问来源于stack exchange,提问作者Matthias B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:12:45