我正在尝试将OleDb参数映射到Oracle函数。我能够使用System.Data.Oracle命名空间执行此操作,但后来发现这已被删除,因此我认为我会将其重新编写为OldDb以避免安装Oracle Provider。
我已经定义了以下oracle函数作为示例:
create function GetImagePath (AIRSNumber in number)
return varchar2
is
begin
return '\\aiimg524\images\Ofndrtrk\2010\01\0kvrv1p000lcs74j';
end;
我正在使用以下代码调用它:
using (var command = new OleDbCommand())
{
command.Connection = con;
command.CommandText = ConfigurationManager.AppSettings[OTRAK_PHOTO_FUNC];
command.CommandType = CommandType.StoredProcedure;
string parm = ConfigurationManager.AppSettings[OTRAK_PHOTO_PARM];
command.Parameters.Add(parm, OleDbType.Decimal); // maps to oracle Number
command.Parameters[parm].Direction = ParameterDirection.Input;
command.Parameters[parm].Value = airsNumber;
command.Parameters.Add(RETURN_VALUE, OleDbType.Variant); // maps to Oracle varchar2
command.Parameters[RETURN_VALUE].Direction = ParameterDirection.ReturnValue;
try
{
con.Open();
command.ExecuteNonQuery();
path = command.Parameters[RETURN_VALUE].Value.ToString();
}
我为参数和返回值尝试了一堆不同的OleDB类型。当前的尝试来自我在网上找到的映射表,其中number = decimal和varchar2 = variant。我即将尝试枚举中每种类型的排列,并希望寻求帮助。我得到的不太有用的错误信息是:
[System.Data.OleDb.OleDbException] = {“ORA-06550:第1行,第7列:\ nPLS-00306:调用'GETIMAGEPATH'\ nORA-06550:第1行的参数数目错误:第7列:\ nPL / SQL:语句忽略“}
答案 0 :(得分:1)
这实际上与参数的类型无关,而是顺序。使用OleDb提供程序不支持参数集合中参数的名称,而是参数的添加顺序。当调用oracle函数时,返回值是必须首先声明的自由参数。通过添加我的返回值参数然后实际的函数参数开始工作。
使用command.Parameters.AddWithValue(parm,value)也简化了一些事情。