2014-06-12 250 views
4

我需要將參數作爲表值傳遞給SQL Server中的存儲過程。如何在Delphi中處理這個問題?Delphi - 將表值參數傳遞給SQL Server存儲過程

+1

[Devart SDAC](http://forums.devart.com/viewtopic.php?f=6&t=24223)支持TVP,但是ADO(Delphi TADOxxx組件)[不支持TVP](http:// stackoverflow的.com /問題/ 1883852 /經典ADO和 - 表值參數-在存儲過程)。 – whosrdaddy

+0

感謝您的回覆@whosrdaddy – user3733328

回答

5

據我所知,在那裏沒有簡單的方法來傳遞表參數,使用Delphi的組件。 解決方法是使用可用於填充類型化表變量的臨時表。

假設你的定義是這樣的:

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 
+0

嗨Bummi,感謝您的快速回答。是否有可能使用clientdataset將表值參數傳遞給delphi。 – user3733328

0

http://msftdpprodsamples.codeplex.com/wikipage?title=SS2008%21Readme_Table-Valued%20Parameters樣本下載是用C++編寫,但可以很容易地轉換爲德爾福。

一旦轉換的代碼德爾福,你可以使用類似下面讓結果集通過老好人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一個私人的功能,但它是相當不重要的。

+0

有趣的答案。它可能會從你的答案中的(代碼)例子中受益,例如,如何將它應用於已經使用TAdoxxx組件的Delphi項目中。 – MartynA

+0

好點。現在工作(因爲我也需要它)... –

+0

好,我會投它。我認爲它只需要一個提綱,fwiw。 – MartynA

相關問題