我有一個存儲過程來處理插入,更新和刪除,以與存儲的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
作爲用戶定義表類型參數?
我已經嘗試過,並且還'command.Parameters.AddWithValue(「@ Testing」,(DataTable)DT1);'但添加參數似乎unbox變量 – Manatherin
感謝您的答覆。我已經添加了另一個建議。它並不像整潔,但可能是一個解決方法。 –
感謝您的建議。我似乎現在就開始工作(我已將我的解決方案作爲答案發布) – Manatherin