【发布时间】: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