【发布时间】:2020-03-05 07:14:08
【问题描述】:
我正在尝试使用 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 设置为Object 或将CollectionType 设置为PLSQLAssociativeArray 而不设置成功。同样传递一个列表或一个对象数组而不是一个表也没有成功。
我目前不知道我还能尝试什么。
任何以高性能方式将大量实体传递给存储过程的方法都会有所帮助。我将它们与合并命令一起使用,因此我需要能够将这些参数转换为表格。
【问题讨论】:
-
SqlParameter是SqlClient库的一部分,该库专门用于 Microsoft SQL Server。
标签: oracle stored-procedures .net-core odp.net ef-core-2.2