我正在尝试使用Oracle.EntityFrameworkCore
包将参数传递给存储过程,如下所示:
DataTable table = new DataTable();
table.Columns.Add("keyColumn",typeof(string));
table.Columns.Add("valueColumn",typeof(string));
var row = table.NewRow();
row.ItemArray = new object[]
{
entry.KeyColumn,entry.ValueColumn
};
table.Rows.Add(row);
var parameter = new OracleParameter("entries",table);
parameter.UdtTypeName = "entry_type_list";
return context.Database.ExecuteSqlCommandAsync(
new RawSqlString( @"EXEC set_entry_list (:entries)" ),parameter);
存储过程和类型的定义如下:
CREATE OR REPLACE TYPE entry_type AS OBJECT
(
"keyColumn" NVARCHAR2(3),"valueColumn" NVARCHAR2(3)
);
CREATE OR REPLACE TYPE entry_type_list AS TABLE OF entry_type;
CREATE OR REPLACE PROCEDURE set_entry_list (entries entry_type_list) AS
BEGIN
REM Doing stuff
END;
但是我得到一个错误:
System.ArgumentException:值不在预期范围内。
在Oracle.ManagedDataaccess.Client.OracleParameter..ctor(String parameterName,Object obj)
此问题的唯一来源是an answer如何使用SQL Server进行此操作,但对于使用EFCore的Oracle则没有答案。这里的问题似乎是Oracle仅接受OracleParameter
,而其他人使用SqlParameter
。
如果我这样使用SqlParameter
类型:
var parameter = new SqlParameter("entries",SqlDbType.Structured);
parameter.TypeName = "entry_type_list";
parameter.Value = table;
我收到此错误:
System.InvalidCastException:无法将类型为“ System.Data.SqlClient.SqlParameter”的对象转换为类型为“ Oracle.ManagedDataaccess.Client.OracleParameter”。
我也尝试将parameter.OracleDbType
设置为不同的值,例如Blob
,RefCursor
,Clob
或XmlType
,将parameter.DbType
设置为{{ 1}}或将Object
设置为CollectionType
都没有成功。同样,传递列表或对象数组而不是表也没有成功。
我目前不知道我还能尝试什么。
以高性能方式将大量实体传递给存储过程的任何方法都将有所帮助。我将它们与merge-command一起使用,因此我需要能够将这些参数转换为表。