无法打开更多表 - 未处理 OleDbException

Posted

技术标签:

【中文标题】无法打开更多表 - 未处理 OleDbException【英文标题】:Cannot open any more tables - OleDbException was unhandled 【发布时间】:2015-03-26 04:28:16 【问题描述】:

美好的一天, 我的问题是如何处理异常或摆脱与“无法打开更多表”有关的错误。对于我正在创建的程序的概述,我在 ms access 2007 中提取了主题记录,我循环到该记录以随机分配一个时间表,然后我将带有分配时间表的新记录一个接一个地插入到表中。

我的插入记录的程序流程只工作了一定次数,比如将近 200 次,在某些时候它会停止并弹出 oledbexception

提前感谢您抽出宝贵时间回答我的问题。

这是我的代码,可以更详细地了解我的程序,

Private Sub Assignsched(ByVal rType As String, ByVal subjectCode As String, ByVal SecID As String, ByVal CourseCode As String)
    If shrdcon.con.State = ConnectionState.Closed Then
        shrdcon.con.Open()
    End If
    Dim RoomNum As Integer
    dtARoom.Clear()
    Dim stoploop As Boolean

    Dim count As Integer = 0

    Dim rm1 As String
    RoomAssign = ""
    rm1 = "SELECT * FROM tblRoom WHERE RoomType = '" & rType & "'"
    Dim dat As New OleDbDataAdapter(rm1, shrdcon.con)
    dat.Fill(ds, "ARoom")




        stoploop = False
        count = 0
        Do Until stoploop = "True"
        RoomNum = rndm.Next(0, ds.Tables("ARoom").Rows.Count)
        RoomAssign = ds.Tables("ARoom").Rows(RoomNum).Item(1)

            ScheduleGeneration()

        If checkExisting(sTime, eTime, RoomAssign, daypick) = False Then


            RoomA = RoomAssign

            GenerateOfferingID()
            Dim cmd1 As New OleDbCommand()
            cmd1.CommandText = "INSERT INTO [tblSubjectOffer]([SubjectOID],[SubjectCode],[SectionID],[Day],[sTime],[eTime],[RoomName],[CourseCode]) VALUES('" & _
                                myId & "','" & subjectCode & "','" & SecID & "','" & daypick & "'," & sTime & "," & eTime & ",'" & RoomA & "','" & CourseCode & "')"
            cmd1.Connection = shrdcon.con
            cmd1.ExecuteNonQuery()
            cmd1.Dispose()

            Dim pipz As New OleDbCommand("Update tblGenerator Set NextNo='" & myId & "' where TableName ='" & "tblSubjectOffer" & "'", shrdcon.con)
            pipz.ExecuteNonQuery()
            pipz.Dispose()
            stoploop = True
        Else
            stoploop = False
        End If
            If stoploop = False Then

            If count = 30 Then
                stoploop = True
            Else

                count = count + 1

            End If
            End If
        Loop
End Sub

【问题讨论】:

***.com/questions/12579186/…和你的问题一样 【参考方案1】:

这是 Microsoft Jet 引擎的典型错误,当您超过 Microsoft Jet 数据库引擎允许的打开 TableID 的最大数量时,Jet3.5 引擎为 2048,旧引擎为 1024。

即使您在每次使用后关闭 Command 对象,您仍然在整个过程中使用相同的连接,该连接实际上保存了 TableID,并且在某个时间点超过了允许打开的 TableID 的数量。

一个可能的解决方案是使用最新的 Jet Engine 更新,它是可用的 here

它可能会解决您的问题,但如果您已经在使用最新的引擎,则必须寻找其他选项来减少数据库操作的数量。

尝试使用UpdateBatch 方法批量应用更新。

希望对你有帮助

Private Sub Command1_Click()

    Dim myConnection As ADODB.Connection
    Dim rsData As ADODB.Recordset

    Set myConnection = New ADODB.Connection
    myConnection.ConnectionString = "xxxxxxxxxxxxxxxxxxxx"
    myConnection.Open

    Set rsData = New ADODB.Recordset
    rsData.CursorLocation = adUseClient
    rsData.Open "select * from mytable", myConnection, adOpenStatic, adLockBatchOptimistic

    For i = 1 To 10000
        rsData.AddNew
        rsData.Fields(0).Value = 1
        rsData.Fields(1).Value = 2
    Next i

    rsData.UpdateBatch

    rsData.Close
    myConnection.Close
    Set rsData = Nothing
End Sub

【讨论】:

就我对 UpdateBatch 的理解而言,在一个命令中一次更新两个或多个记录是否正确?我从您那里得到一个想法,先将我的记录添加到数据表中,然后再将其作为批处理插入到我的访问数据库中,但随着我的研究继续进行,我仍然找不到如何实现它 @Arvin 编辑了我的答案以包含 UpdateBatch 的示例 我认为您的示例代码不适用于Visual Studio,我尝试了您的代码并且出现错误,如果我错了,请纠正我,您的代码是否仅适用于vb6?我尝试将我的数据库迁移到 sql express,但不确定是否遇到与 ms 访问相同的问题。 谢谢@Saagar,无需回答我之前的评论,因为我已经通过将数据库更改为 sql express 解决了我的问题。【参考方案2】:

晚上好, 最近我遇到了这种类型的错误,我可以通过添加来解决它 con.close 并在任何插入/更新或选择语句之前调用 conState(下面的过程 conState-检查) 在我的代码中,我有类似

For i = 0 To DataGridView1.RowCount - 1


            reg = DataGridView1.Rows(i).Cells(0).Value
            Label2.Text = reg

'i added this two lines
            ***con.Close()***
            ***Call conState()***

            Dim cmdcheck As New OleDbCommand("Select * from [2015/2016 UG CRF] where regno ='" & reg & "'", con)
            Dim drcheck As OleDbDataReader
            drcheck = cmdcheck.ExecuteReader
            If drcheck.Read = True Then

                GoTo A

            End If

            coursesFirst = String.Empty
            coursesSecond = String.Empty
            creditFirst = 0
            creditSecond = 0
            Dim cmdlevel As New OleDbCommand("Select * from [2015/2016 UG registration Biodata 5 april 16] where regno ='" & reg & "'", con)
            Dim drlevel As OleDbDataReader
            drlevel = cmdlevel.ExecuteReader

            If drlevel.Read = True Then
                level = drlevel.Item("level").ToString
                faculty = drlevel.Item("faculty").ToString
                program = drlevel.Item("programme").ToString

            End If

...............

next

conState 是一个连接测试,如果连接关闭,应该像下面这样再次打开它

Public Sub conState()
        If con.State = ConnectionState.Closed Then
            con.Open()

        End If

    End Sub

这会停止错误信息

【讨论】:

【参考方案3】:

我在我的 C# 应用程序中遇到了这个异常,原因是使用 OleDbDataReader 实例而不关闭它们:

OleDbDataReader reader = cmd.ExecuteReader();
bool result = reader.Read();
reader.Close(); // <= Problem went away after adding this
return result;

【讨论】:

以上是关于无法打开更多表 - 未处理 OleDbException的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01219:数据库未打开:仅允许在固定表/视图中查询

ORA-01219:数据库未打开:仅允许在固定表/视图中查询

错误显示“无法获取样式表 (#) 的文本:未找到具有给定 id 的样式表”,这是啥意思?

Hyper-V:无法打开虚拟机XXX,因为虚拟机监控程序未运行

未终止的字符串文字 jquery 或更多

Flutter:未处理的异常:无法加载资产