我有一个存储过程用于处理对一个被定义为的表进行插入、更新和删除操作
CREATE TABLE [dbo].[TestTable](
[Id] [int] PRIMARY KEY NOT NULL,
[Data] [nvarchar](50) NOT NULL,
[ChangeDate] [datetime] NULL)
使用存储过程
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 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));
to
DataSet1.TestDataTable DT = new DataSet1.TestDataTable();
当我尝试使用强类型的DataTable
结构作为用户定义表类型参数时,我遇到了一个Argument Exception
错误:
不存在从对象类型TestBulkInsertDataset.DataSet1+TestDataTable到已知托管提供程序本机类型的映射。
有没有办法将强类型的DataTable
作为用户定义的表类型参数使用?
command.Parameters.AddWithValue("@Testing", (DataTable)DT1);
,但是添加参数似乎会取消变量的装箱。 - Manatherin