【问题标题】:What possible causes are there to "Item has already been added...Oracle.DataAccess"?“项目已被添加...Oracle.DataAccess”有哪些可能的原因?
【发布时间】:2015-07-10 21:23:25
【问题描述】:

我正在尝试通过 Oracle.DataAccess.Client 调用 Oracle 存储过程。实际的 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)

我不知道从哪里开始诊断这个问题;我的代码中没有哈希表,堆栈跟踪也没有告诉我问题发生在框架或库代码的哪个位置。谷歌搜索没有产生任何似乎相关的东西。我可以很好地查询数据,并且可以成功运行另一个存储过程。我可以使用相同的凭据和参数直接在 SQL Developer 中毫无问题地运行这个存储过程。

我收到了类似的错误消息,它指的是一个没有实际使用的通用实用程序库。删除引用给我留下了上述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);

【问题讨论】:

  • 您是否尝试过使用 MySchema.SimpleVARRAYCustomType 的代码生成向导?它是 Oracle Developer Tools for Visual Studio 的一部分。 oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r1/appdev/…
  • 一般来说,出于性能和易用性考虑,我建议不要使用 VARRAY,因为可以使用关联数组来代替。 oracle.com/technetwork/issue-archive/2007/07-jan/…
  • @ChristianShay:不,尽管我不想为这个简单的任务深入到库中。当传入数据未键入时, assoc 数组有什么优势? VARRAY 似乎是最简单的集合,因为替代方案是包含 CSV 的标量。
  • 我提到了代码生成向导作为健全性检查。确保它适用于此,然后将其代码与您使用的代码进行比较。我想你会发现关联数组更容易编码。至于 assoc 数组,这是一个性能考虑。关联数组相当但速度更快,并且 VARRAY(以及一般的 UDT)可能存在性能问题。如果您不太担心性能,请选择您更喜欢的那个。您也可以使用临时表。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多