可能的原因是“Item已添加... Oracle.DataAccess”?

问题描述 投票:1回答:1

我试图通过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);
c# oracle odp.net custom-type
1个回答
0
投票

我刚开始得到同样的错误,但是当用UDT排队消息时。我为UDT定义的类缺少一个构造函数。我认为您需要为UDT MySchema.SimpleVARRAYCustomType生成一个类,以使用您的值实例化该类的对象,并将其分配给param.Value。

© www.soinside.com 2019 - 2024. All rights reserved.