2012-11-16 34 views
3

我有一個存儲過程來處理插入,更新和刪除,以與存儲的prodedure強類型數據集作爲用戶定義的表型參數

CREATE PROCEDURE MergeTest 
    @Testing TestTableType readonly 
AS 
BEGIN 
    MERGE INTO Testing as Target 
    USING (SELECT * FROM @Testing) AS SOURCE 
     ON (Target.Id = Source.Id) 
    WHEN MATCHED THEN 
     UPDATE SET 
      Target.Data = Source.Data, 
      Target.ChangeDate = Source.ChangeDate 
    WHEN NOT MATCHED BY TARGET THEN 
     INSERT (Data, ChangeDate) 
     VALUES (Source.Data, Source.ChangeDate) 
    WHEN NOT MATCHED BY SOURCE THEN 
     DELETE; 

    RETURN 0; 
END 

和UDT定義爲

CREATE TABLE [dbo].[TestTable](
    [Id] [int] PRIMARY KEY NOT NULL, 
    [Data] [nvarchar](50) NOT NULL, 
    [ChangeDate] [datetime] NULL) 

一個表鍵入爲

CREATE TYPE TestTableType AS TABLE(
    [Id] [int] PRIMARY KEY NOT NULL, 
    [Data] [nvarchar](50) NOT NULL, 
    [ChangeDate] [datetime] NULL) 

我試圖用這個結構做C#的批量插入等。使用下面的代碼它的工作原理:

using (SqlConnection connection = new SqlConnection(@"...")) 
{ 
    connection.Open(); 

    DataTable DT = new DataTable(); 
    DT.Columns.Add("Id", typeof(int)); 
    DT.Columns.Add("Data", typeof(string)); 
    DT.Columns.Add("ChangeDate", typeof(DateTime)); 

    for (int i = 0; i < 100000; i++) 
    { 
     DT.AddTestRow((i + 1), (i + 1).ToString(), DateTime.Now); 
    } 

    using (SqlCommand command = new SqlCommand("MergeTest", connection)) 
    { 
     command.CommandType = CommandType.StoredProcedure; 
     command.Parameters.AddWithValue("@Testing", DT); 
     command.ExecuteNonQuery(); 
    } 
} 

然而,當我改變行

DataTable DT = new DataTable(); 
DT.Columns.Add("Id", typeof(int)); 
DT.Columns.Add("Data", typeof(string)); 
DT.Columns.Add("ChangeDate", typeof(DateTime)); 

DataSet1.TestDataTable DT = new DataSet1.TestDataTable(); 

這是相同的DataTable結構我得到的強類型版本Argument Exception Error

不存在從對象類型TestBulkInsertDataset.DataSet1 + TestDataTable到已知託管提供程序本機類型的映射。

是否有任何方式使用強類型DataTable作爲用戶定義表類型參數?

回答

3

找到了答案。使用強類型數據表時,必須指定參數的類型。參數行變爲:

var testingparam = command.Parameters.AddWithValue("@Testing", DT); 
testingparam.SqlDbType = SqlDbType.Structured; 

然後它都可以工作。

1

你有沒有試過類似的東西?

DataSet1.TestDataTable DT = new DataSet1.TestDataTable(); 

// Fill data table 

DataTable DT1 = DT; // DataSet1.TestDataTable should be a subclass of DataTable 

using (SqlCommand command = new SqlCommand("MergeTest", connection)) 
{ 
    command.CommandType = CommandType.StoredProcedure; 
    command.Parameters.AddWithValue("@Testing", DT1); 
    command.ExecuteNonQuery(); 
} 

如果類型數據集仍然是常規的數據集和數據表的子類,我認爲這是可行的。

ETA:既然不行,那這個怎麼樣?

DataSet DS1 = new DataSet(); 
DS1.Merge(DT, false, MissingSchemaAction.Add); 

// etc. 

command.Parameters.AddWithValue("@Testing", DS1.Tables[0]); 

假設作品(你可能有合併方法的重載擺弄,以獲得期望的結果),你會得到DataSet中的DataTable具有架構和DT的數據,該DataSet1.TestDataTable,但只是類型DataTable

+0

我已經嘗試過,並且還'command.Parameters.AddWithValue(「@ Testing」,(DataTable)DT1);'但添加參數似乎unbox變量 – Manatherin

+0

感謝您的答覆。我已經添加了另一個建議。它並不像整潔,但可能是一個解決方法。 –

+0

感謝您的建議。我似乎現在就開始工作(我已將我的解決方案作爲答案發布) – Manatherin

相關問題