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

时间:2015-07-10 21:23:26

标签: c# oracle odp.net custom-type

我试图通过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);

1 个答案:

答案 0 :(得分:0)

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