2010-04-28 45 views
0

从微软Oracle驱动程序切换到ODP.NET版本10.2.0.100。在一个过程中将数据类型更改为OracleDBTypes后,使用System.Data.OracleClient可以高效地工作,如果我们尝试传入20个以上参数,则过程将失败。返回的错误是:如何使用ODP.Net将20个参数发送到存储过程?

ORA-06550:第1行,第7列:PLS-00306:错误数量或类型的在调用 'ADD_TARP_EVENT' ORA-06550参数:第1行,第7列:PL/SQL :Statement ignorede

如果我们将参数数量减少到小于20,它就可以工作。这是一个已知的问题?

这里创建参数代码:

Shared Function CreateTarpEventCommand(ByVal aTarpEvent As TARPEventType) As OracleCommand 
    Dim cmd As New OracleCommand 

    With aTarpEvent 

     cmd.Parameters.Add(New OracleParameter("I_facID_C", OracleDbType.Char)).Value = .FacilityShortName 
     cmd.Parameters.Add(New OracleParameter("I_facName_VC", OracleDbType.Varchar2)).Value = .FacilityLongName 
     cmd.Parameters.Add(New OracleParameter("I_client_VC", OracleDbType.Varchar2)).Value = .ComputerNameTarpIsRunningOn 
     cmd.Parameters.Add(New OracleParameter("I_TARP_Version_VC", OracleDbType.Varchar2)).Value = .TarpVersionNumber 
     cmd.Parameters.Add(New OracleParameter("I_NAS_Type_VC", OracleDbType.Varchar2)).Value = .FacilityNASSystemType 
     cmd.Parameters.Add(New OracleParameter("I_Aircraft1_Callsign_VC", OracleDbType.Varchar2)).Value = .Aircraft1Callsign 

     If .Aircraft1Type Is Nothing Then 
      cmd.Parameters.Add(New OracleParameter("I_Aircraft1_Type_VC", OracleDbType.Varchar2)).Value = .Aircraft1Type 
     End If 

     If .Aircraft1Category Is Nothing Then 
      cmd.Parameters.Add(New OracleParameter("I_Aircraft1_Cat_VC", OracleDbType.Varchar2)).Value = .Aircraft1Category 
     End If 

     cmd.Parameters.Add(New OracleParameter("I_Aircraft2_Callsign_VC", OracleDbType.Varchar2)).Value = .Aircraft2Callsign 

     If .Aircraft2Type Is Nothing Then 
      cmd.Parameters.Add(New OracleParameter("I_Aircraft2_Type_VC", OracleDbType.Varchar2)).Value = .Aircraft2Type 
     End If 

     If .Aircraft2Category Is Nothing Then 
      cmd.Parameters.Add(New OracleParameter("I_Aircraft2_Cat_VC", OracleDbType.Varchar2)).Value = .Aircraft2Category 
     End If 

     If .SensorShortName Is Nothing Then 
      cmd.Parameters.Add(New OracleParameter("I_Sensor_Name_VC", OracleDbType.Varchar2)).Value = .SensorShortName 
     End If 


     If .TarpConfigurationName Is Nothing Then 
      cmd.Parameters.Add(New OracleParameter("I_TARP_Config_Name_VC", OracleDbType.Varchar2)).Value = .TarpConfigurationName 
     End If 

     If .EntryCreatorID Is Nothing Then 
      cmd.Parameters.Add(New OracleParameter("I_Create_VC", OracleDbType.Varchar2)).Value = .EntryCreatorID 
     End If 

     If .LogAction Is Nothing Then 
      cmd.Parameters.Add(New OracleParameter("I_Log_Action_VC", OracleDbType.Varchar2)).Value = .LogAction 
     End If 

     cmd.Parameters.Add(New OracleParameter("I_TARP_Mode_VC", OracleDbType.Varchar2)).Value = .TarpOperatingMode 
     cmd.Parameters.Add(New OracleParameter("I_Min_Loss_N", OracleDbType.Decimal)).Value = .ClosestMeasureOfLoSS 

     If .MapName Is Nothing Then 
      cmd.Parameters.Add(New OracleParameter("I_MAP_NAME_VC", OracleDbType.Varchar2)).Value = .MapName 
     End If 

     If .TarpConfigurationFileHash Is Nothing Then 
      cmd.Parameters.Add(New OracleParameter("I_CONFIG_HASH_VC", OracleDbType.Varchar2)).Value = .TarpConfigurationFileHash 
     End If 

     Dim aDate As OracleDate = CType(.LossEventsMessages(0).LossEventTime, System.DateTime) 
     cmd.Parameters.Add(New OracleParameter("I_FIRST_LOSS_EVENT_DATE", OracleDbType.Date)).Value = aDate 
     cmd.Parameters.Add(New OracleParameter("I_FIRST_LOSS_EVENT_MS_N", OracleDbType.Int32)).Value = .LossEventsMessages(0).LossEventMilliSeconds 

     If .ZippedMapFiles Is Nothing Then 
      cmd.Parameters.Add(New OracleParameter("I_Map_File_BL", OracleDbType.Blob)).Value = .ZippedMapFiles 
     End If 

     cmd.Parameters.Add(New OracleParameter("I_TARP_Package_BL", OracleDbType.Blob)).Value = .ZippedTarpPackageWithoutMaps 

     cmd.Parameters.Add(New OracleParameter("rs_RESULTS", OracleDbType.RefCursor)).Direction = ParameterDirection.Output 

    End With 
    Return cmd 
End Function 

这里是执行程序的代码:

Dim workingDataSet As New DataSet 
    Dim oracleConnection As New OracleConnection 
    Dim cmd As New OracleCommand 
    Dim oracleDataAdapter As New OracleDataAdapter 

    Try 

     Using oracleConnection 
      oracleConnection.ConnectionString = System.Configuration.ConfigurationManager.AppSettings("MasterConnectionODT") 
      cmd = HelperDB.CreateTarpEventCommand(TarpEvent) 

      cmd.Connection = oracleConnection 
      cmd.CommandText = "LOADER.ADD_TARP_EVENT" 
      cmd.CommandType = CommandType.StoredProcedure 

      Using oracleConnection 
       oracleConnection.Open() 
       Dim aTransation As OracleTransaction = oracleConnection.BeginTransaction(IsolationLevel.ReadCommitted) 
       Try 
        Using oracleDataAdapter 
         oracleDataAdapter = New OracleDataAdapter(cmd) 
         oracleDataAdapter.TableMappings.Add("Results", "rs_Max") 
         oracleDataAdapter.Fill(workingDataSet) 

....

+0

一些ODP.NET的旧版本的已经可怕,越野车和不稳定。您是否有能力尝试当前版本以查看问题是否消失?一旦我切换到11.1.0.7.20,我一直对ODP.NET感到高兴。 – 2010-04-28 18:20:59

+0

任何最终的解决方案与源代码? – Kiquenet 2013-10-29 17:52:24

回答

2

这让我感到吃惊,因为20并不是那么高的数字,我认为这很可能是你将某些参数混合起来(当它超过20个参数时,很容易做到)。

但尝试一下我建议创建过程有21个参数,全部为数字,然后在1发送给所有的人,这样你可以确保它不只是一个输入错误。

0

有两种调用Oracle过程的两个方面。第一个被命名为符号

proc (p_1 => 'test', p2 => 1); 

第二是位置

proc ('test', 1); 

命名符号中,你可以把参数以任意顺序和忽略任何与一个DEFAULT定义。在位置表示法中,它们必须按照它们定义的顺序排列,并且只有最后一个可以省略。也就是说,如果你提供了五个参数,并且程序有六个定义,那么它假定失踪的是第六个。再次,第六个必须有一个DEFAULT。输出参数不能有缺省值并且必须提供。

我不知道如何ODP工程,以选择要使用的(尽管它可以通过使用DBMS_MONITOR跟踪会话,并查看生成的跟踪文件确认)。

无论如何,检查参数的名称相匹配那些在你的代码。 Oracle将标识符视为大写,除非引用。另外,如果任何参数没有DEFAULT,它们必须在调用中设置(即使设置为null)。

0

存储的过程“LOADER.ADD_TARP_EVENT”默认的程序参数值以空适用在服务器端。当我们构建ADO Oracle命令时,我们没有填充Null参数,因为它们在过程中已被设置为默认值为Null。这对ADO.NET非常有用。 ODT aparently要求将值作为dbNull传入。一旦我们传入dbNull,所有值都按预期工作。

相关问题