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
相关产品推荐
相关产品推荐

