提供程序OraOLEDB.Oracle在12C上有AccessViolationException吗?

问题描述

我们使用了带有MSDAORA作为提供程序的Oracle 11g,但是由于将不推荐使用MSDAORA,因此我们必须转到连接字符串的新提供程序。我们现在也正在使用Oracle Client 12c

在使用之前:Provider = MSDAORA.1;密码= ;用户ID = ;数据源= **** 11G 。世界;坚持安全信息=真

现在,我们尝试使用:Provider = OraOLEDB.Oracle; OLEDB.NET = true; PLSQLRSet = true;密码= ;用户ID = *;数据源= **** 11G.world;持久安全信息=真实

问题是IIS崩溃,我们遇到了这个异常,我们已经尝试解决这个问题了好几个星期了,但是还没有运气:

异常详细信息
SystemAccessViolationException 尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

  • at System.Data.Common.UnsafeNativeMethods.1CommandTextExecute ((IntPtr pUnkOuter,Guid&riid,tagDBPARAMS pDBParams,IntPtr和pcRowsAffected, Object&ppRowset)
  • System.Data.01eDb.0IeDbCommand.ExecuteCommandTextForSingleResult (标签DBPAFtAMS dbParams,Object&executeResult)
  • ,位于System.Data.OleDb.OleDbCommand.ExecuteCommandText (对象和 executeResult)
  • 在System.Data.OleDb.OleDbCommand.ExecuteCommand上(CommandBehavior行为,Object和executeResult)
  • ,位于System.Data.01eDb.01eDbCommand.ExecuteReaderIntemal (CommandBehavior 行为,字符串方法)
  • 在System.Data.OleDb.OleDbCommand.ExecuteReader中(CommandBehavior行为)
  • ,位于System.Data.01eDb.0IeDbCommand.System.Data.IDbCommand.ExecuteReader (CommandBehavior 行为)
  • ,位于System.Data.Common.DbDataAdapter.Filllnternal (数据集数据集,DataTable0数据表,Int32 startRecord,Int32 maxRecords,字符串 srcTable,IDbCommand命令,CommandBehavior行为)
  • ,位于System.Data.Common.DbDataAdapter.Fill (DataTableD dataTables,Int32 startRecord,Int32 maxRecords,IDbCommand命令, CommandBehavior行为)
  • ,位于System.Data.Common.DbDataAdapter.Fill (数据表dataTable)
  • 位于D:Projects \ M \ Planned_Data.aspx.vb:line 637中的M.Planned_DataloadDataCurGrid()
  • 位于DAProjectAM \ Planned_Data.aspx.vb:line中的M.Planned_Data.cmbProgram_SelectedIndexChanged (对象发送方,EventArgs e) 484
  • ,位于System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged (EventArgs e)
  • 在System.Web.ULWebControls.DropDownListRaisePostDataChangedEvent()
  • 在System.Web.UI.WebControls.DropDownListSystem.Web.ULIPostBackDataHandler.RaisePostDataChangedEvento
  • 在System.Web.ULPage.RaiseChangedEvents()

这是一个简单的最小复制品:

     Public Sub LoadGrid()
        Dim ocn As OleDbConnection = New OleDbConnection("Provider=OraOLEDB.Oracle;OLEDB.NET=true;PLSQLRSet=true; Password=*****;User ID=*****;Data Source=****11G.world;Persist Security Info=True")
        Dim oda As New OleDbDataAdapter
        Dim odataSet As New DataTable

        Dim opm As OleDbParameter

        Dim oCmd As New OleDbCommand

        opm = New OleDbParameter("pi_language_code",OleDbType.Char)
        opm.Value = "E"
        oCmd.Parameters.Add(opm)

        opm = New OleDbParameter("pi_year_id",OleDbType.Integer)
        opm.Value = "2020"
        oCmd.Parameters.Add(opm)

        opm = New OleDbParameter("pi_month_id",OleDbType.Integer)
        opm.Value = "2"
        oCmd.Parameters.Add(opm)

        opm = New OleDbParameter("pi_program_id",OleDbType.Integer)
        opm.Value = "4"
        oCmd.Parameters.Add(opm)

        opm = New OleDbParameter("pi_location_id",OleDbType.Integer)

        opm.Value = "2"

        oCmd.Parameters.Add(opm)

        Try

            ocn.Open()
            oCmd.Connection = ocn
            oCmd.CommandType = CommandType.StoredProcedure
            oCmd.CommandText = "***********"

            oCmd.ExecuteNonQuery()

            oda.SelectCommand = oCmd

            odataSet.Clear()
            oda.Fill(odataSet) 'This is where it crashes

          

            Dim rowcount As Integer = odataSet.Rows.Count

            dgCurrentYear.DataSource = odataSet
            dgCurrentYear.DataBind()

            If rowcount > 0 Then
                dgCurrentYear.Visible = True

            Else
                dgCurrentYear.Visible = False

            End If

        Catch ex As OleDbException
            ' Display the error


        Catch ex As Exception
            ' Display the error

        Finally
            ' Clean up
            If (Not ocn Is Nothing) AndAlso (Not ocn.State = ConnectionState.Closed) Then
                ocn.Close()
            End If

            ocn = Nothing
            opm = Nothing

        End Try

    End Sub

解决方法

因此我们通过删除行oCmd.ExecuteNonQuery()

解决了该问题

因为我不必调用ExecuteNonquery,因为DataAdapter的fill方法可以解决这个问题。 Programming Practice: Using ExecuteNonQuery with SqlDataAdapter

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...