如何使用 MS Excel 驱动程序将工作表读取到数据表中时解决“客户端任务过多”错误

How to resolve "too many client tasks" error when using MS Excel Driver to read worksheet into a data table

提问人:BernsJ 提问时间:8/14/2023 最后编辑:ChenmunkaBernsJ 更新时间:8/16/2023 访问量:92

问:

社区

我从这个线程中获取了一些 VB 代码,以便将工作表内容读取到数据表中。

发短信

Public Shared Function ReadExcelIntoDataTable(ByVal FileName As String, ByVal SheetName As String) As DataTable
    Dim RetVal As New DataTable
    Dim strConnString As String
    strConnString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & FileName & ";"

    Dim strSQL As String 
    strSQL = "SELECT * FROM [" & SheetName & "$]"

    Dim y As New Odbc.OdbcDataAdapter(strSQL, strConnString)
    y.Fill(RetVal)

    Return RetVal
End Function

该代码在前 3-4 次使用中有效,但随后发生此错误:

错误 [08004] [Microsoft] [ODBC Excel 驱动程序] 客户端任务过多。

在此处<<图片>>在此处输入图片描述

我必须退出/重新启动应用程序才能继续开发。大约四次运行后,错误再次发生,我必须重新启动应用程序。

我得出结论,连接没有关闭,因此导致“客户端任务过多”。对错误消息的搜索还表明已关闭的连接存在问题。

有关如何更改代码以防止错误的任何建议将不胜感激

研究错误消息无助于确定关闭连接的任何特定方法。

Excel vb.net Datatable 驱动程序

评论

0赞 Craig 8/14/2023
这不一定是眼前的问题,而是(间接)实现,因此您必须放入一个块或在完成它后手动调用它。OdbcDataAdapterIDisposableyUsingDispose
0赞 BernsJ 8/14/2023
比如这个?代码块将 y 调暗为新 Odbc.OdbcDataAdapter(strSQL, strConnString) y.Fill(RetVal) y.Dispose 返回 RetVal
0赞 BernsJ 8/14/2023
抱歉 - 第一次发帖,还没有弄清楚如何在评论中正确发布代码。
0赞 Craig 8/14/2023
评论并不真正支持发布代码。或多或少这是对的,但我更喜欢一个块,即.块的末尾将负责呼叫。UsingUsing y = New Odbc.OdbcDataAdapter...Dispose
0赞 BernsJ 8/14/2023
我切换到 Using 块并按顺序运行程序 10+ 次。没有更多的错误!非常感谢@Craig!

答:

1赞 Craig 8/14/2023 #1

看起来这是一个常见问题的新表现形式。 实现(间接地,在基类中向上几个级别)。每当您使用实现的东西时,这是您在完成它时必须调用的信号。通常是因为需要释放某种资源分配。OdbcDataAdapterIDisposableIDisposableDispose

在这种情况下,正确的做法是使用一个块,该块将在退出块时负责呼叫您(并且还要注意确保即使在发生异常的情况下也会发生):UsingDispose

Using y = New Odbc.OdbcDataAdapter(strSQL, strConnString)
    y.Fill(RetVal)
End Using