我正在使用SQL Server 2008 R2并且我创建了一个用户定义类型:
create type dbo.UDT as table (FirstName varchar(50) null, LastName varchar(50) null)
我创建了一个将此UDT作为参数的存储过程:
create procedure dbo.InsertIntoMyTableUsingUDT (@udt dbo.UDT readonly)
as
begin
set nocount on;
insert into dbo.MyTable (FirstName, LastName)
select FirstName, LastName from @udt;
return;
end
我想使用VBA的ADO(ADO.COM/OLE数据库)使用此存储过程批量上传10,000多条记录。
我已经尝试将ADODB.Recordset作为参数传递给ADODB.Command:
<code that creates ADODB.Recordset 'rst' here...>
Dim com as ADODB.Command
Set com = new ADODB.Command
With com
.ActiveConnection = "Provider=SQLOLEDB.1;Data Source=localhost;Initial Catalog=TestDB;Integrated Security=SSPI;"
.CommandText = "dbo.InsertIntoMyTableUsingUDT"
.CommandType = adCmdStoredProc
.Parameters.Refresh
.Parameters(1).Value = rst '<----the ADODB.Recordset created above
.Execute
End With
但是我得到了运行时错误:
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
在立即窗口中检查参数的类型我得到:
?com.Parameters(1).Type
143
我在MSFT的OLE DB DataTypeEnums列表中看不到:
http://msdn.microsoft.com/en-gb/library/windows/desktop/ms675318(v=vs.85).aspx
所以我尝试传入一个二维数组而不是ADODB.Recordset,但后来我得到了错误:
Bad variable type.
两次尝试都失败了,这让我感到难过
我知道可以使用ADO.NET和SqlParameterCollection.AddWithValue方法在VB.NET中完成。
我想知道是否有一种方法可以使用ADO.COM在VBA中执行此操作。有人做过吗?
或者,是否有不同的方法来实现相同的功能(批量上传,而不是在循环中调用ADODB.Command 10,000次以上)?
干杯