我试图通过Oracle.DataAccess.Client调用Oracle sproc。实际的exec调用会产生此错误:
Item has already been added. Key in dictionary: 'Oracle.DataAccess,
Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342' Key
being added: 'Oracle.DataAccess, Version=4.121.1.0, Culture=neutral,
PublicKeyToken=89b483f429c47342'
堆栈追踪:
at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add)
我不知道从哪里开始诊断这个问题;我的代码中没有哈希表,并且堆栈跟踪没有告诉我在框架或库代码中发生问题的位置。谷歌搜索没有产生任何似乎相关的东西。我可以很好地查询数据,我可以成功运行另一个sproc。我可以直接在SQL Developer中运行这个sproc而没有问题,使用相同的信誉和参数。
我收到了类似的错误消息,指的是一个实际上没有使用过的通用实用程序库。删除引用会使我遇到上述Oracle.DataAccess
错误。
这是代码;这只是随意测试,因此缺乏错误处理。
var conn = new OracleConnection("<conn string>"); conn.Open();
var cmd = new OracleCommand("MySchema.MySproc", conn);
cmd.CommandType = CommandType.StoredProcedure;
var param = new OracleParameter("ID", OracleDbType.Decimal, ParameterDirection.Input);
param.Value = 1234;
cmd.Parameters.Add(param);
// Several more IN params; there are no name collisions
param = new OracleParameter("NumUpdatesMade", OracleDbType.Decimal, ParameterDirection.Output);
cmd.Parameters.Add(param);
param = new OracleParameter("TypeList", OracleDbType.Array, ParameterDirection.Input);
param.UdtTypeName = "MySchema.SimpleVARRAYCustomType";
param.Value = new [] { "A", "B" };
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery(); // Error thrown here
Console.Out.WriteLine(cmd.Parameters["NumUpdatesMade"]);
之前我没有使用过Oracle自定义类型,而我成功测试的其他sproc没有自定义类型。但是,如果是问题,我希望在错误消息中看到一些提示。
如果相关,则以下是自定义类型的定义:
CREATE OR REPLACE TYPE MySchema.SimpleVARRAYCustomType AS VARRAY(100) OF VARCHAR2(5);
答案 0 :(得分:0)
我刚刚开始得到同样的错误,但是当用UDT排队消息时。我为UDT定义的类缺少一个构造函数。我认为您需要为UDT MySchema.SimpleVARRAYCustomType生成一个类,以使用您的值实例化该类的对象,并将其分配给param.Value。