【问题标题】:Delphi - pass table valued parameter to SQL Server stored procedureDelphi - 将表值参数传递给 SQL Server 存储过程
【发布时间】:2014-06-12 08:59:36
【问题描述】:

我需要将参数作为表值传递给 SQL Server 中的存储过程。如何在 Delphi 中处理这个问题?

【问题讨论】:

标签: sql sql-server delphi stored-procedures


【解决方案1】:

据我所知,没有简单的方法可以使用 Delphi 附带的组件来传递 Table 参数。 一种解决方法是使用可用于填充类型表变量的临时表。

假设您的定义如下所示:

CREATE TYPE MyTableType AS TABLE 
( ID int
, Text varchar(100) )
GO

CREATE PROCEDURE P_Table 
    @Tab MyTableType READONLY
AS
BEGIN
    SET NOCOUNT ON;
    Select * from @Tab -- dummy operation just return the dataset
END
GO

你可以这样调用这个过程:

var
  i: Integer;
begin
  // we create a temporary table since a table variable can obly be used for a single call
  DummyDataset.Connection.Execute('Create Table #mytemp(ID int,Text varchar(100))');
  DummyDataset.CommandText := 'Select * from #mytemp';
  DummyDataset.Open;
  for i := 0 to 10 do
  begin
    DummyDataset.Append;
    DummyDataset.Fields[0].Value := i;
    DummyDataset.Fields[1].Value := Format('A Text %d', [i]);
    DummyDataset.Post;
  end;
  MyDataset.CommandText := 'Declare @mytemp as MyTableType '
                         + 'Insert into @mytemp select * from #mytemp '  // copy data to typed table variable
                         + 'EXEC P_Table @Tab = @mytemp';
  MyDataset.Open;
  DummyDataset.Connection.Execute('Drop Table #mytemp');
end

【讨论】:

  • 嗨,Bummi,感谢您的快速回答。是否可以使用clientdataset将表值参数传递给delphi。
【解决方案2】:

可从http://msftdpprodsamples.codeplex.com/wikipage?title=SS2008%21Readme_Table-Valued%20Parameters 下载的示例是用 C++ 编写的,但可以很容易地翻译成 Delphi。

将代码翻译成 Delphi 后,您可以使用类似以下的内容通过良好的 ole ADO 访问结果集:

SourcesRecordset := CreateADOObject(CLASS_Recordset) as _Recordset;
RSCon := SourcesRecordset as ADORecordsetConstruction;
RSCon.Rowset := rowset;

LDataSet := TADODataSet.Create(nil);
try
  // Only doing the first result set
  LDataSet.Recordset := SourcesRecordset;
  while not LDataSet.Eof do
  begin
    //... something
    LDataSet.Next;
  end;
finally
  LDataSet.Free;
end;

请注意,CreateADOObjectData.Win.ADODB.pas 中的私有函数,但它非常简单。

【讨论】:

  • 有趣的答案。它可能会受益于您回答如何在上下文中应用它的(代码)示例,例如,已经使用 TAdoxxx 组件的 Delphi 项目。
  • 好,我会投赞成票。我认为它只需要一个大纲,fwiw。
  • 将 OLEDB 代码翻译成 Delphi 比我希望的要多。鉴于我们很难在客户端机器上依赖 NSQLCLI 版本,我们可能会选择上面@bummi 的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多