如何解决提供程序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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。