如何将C#列表绑定到Oracle存储过程的列表参数?
C# ADO.NET 传入字符串列表到Oracle存储过程报错解决
我尝试用C#结合ADO.NET,将字符串列表作为参数传入Oracle存储过程的自定义字符串列表类型参数,但触发了参数类型/数量不匹配的错误,以下是相关代码及报错信息:
模型类
public class PieceList { public List<string> p_PieceIdList { get; set; }; }
AJAX前端代码
var p_PieceIdList = ["123456AA"]; var p_producttype = null; // 其他参数省略 var veri = { p_PieceIdList: p_PieceIdList, p_producttype: p_producttype, // 其他参数省略 }; $.ajax({ type: "POST", url: "/Test/TestList", data: veri, success: function (data) { // 成功回调逻辑 } });
C#后端代码
public JsonResult TestList(PieceList pieceList) { // 数据库连接及Command初始化省略 command.Parameters.Add("p_PieceIdList", OracleDbType.Array).Value = new string[] { "23480465GA" }; command.Parameters.Add("p_producttype", OracleDbType.Varchar2).Value = pieceList.p_producttype; command.Parameters.Add("p_outcursor", OracleDbType.RefCursor).Direction = ParameterDirection.Output; command.ExecuteNonQuery(); // 后续逻辑省略 }
Oracle存储过程参数定义
p_PieceIdList IN T_STRING_LIST, p_producttype IN VARCHAR2, -- 其他参数省略 p_outcursor OUT SYS_REFCURSOR
报错信息
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'PIECE_LIST'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
解决步骤
指定Oracle自定义数组类型名称
使用OracleDbType.Array时,必须明确指定Oracle端定义的数组类型名称,否则ADO.NET无法匹配到T_STRING_LIST。修改参数添加逻辑:var arrayParam = new OracleParameter("p_PieceIdList", OracleDbType.Array); arrayParam.Value = pieceList.p_PieceIdList?.ToArray() ?? Array.Empty<string>(); arrayParam.UdtTypeName = "T_STRING_LIST"; // 关键:指定Oracle自定义类型名 command.Parameters.Add(arrayParam);验证Oracle自定义类型定义
确保T_STRING_LIST在Oracle中定义正确,例如:CREATE OR REPLACE TYPE T_STRING_LIST AS TABLE OF VARCHAR2(50);若为嵌套表类型,需确认存储过程中使用的类型与定义一致。
正确传递前端参数
后端代码中不要硬编码数组值,直接使用前端传入的pieceList.p_PieceIdList转换为数组即可。核对参数数量与顺序
确保Command中添加的参数数量、顺序与存储过程定义完全匹配,无遗漏或多余参数。
内容的提问来源于stack exchange,提问作者Osman TÜRK
相关产品推荐
相关产品推荐

