mysql - 使用 BulkCopy 时出错(无法读取结果集)

标签 mysql .net vb.net sqlbulkcopy connector-net

我开发了一个 vb.net 应用程序,它使用来自另一台服务器的 API 请求填充表,并使用 MySqlBulkCopy 将这些表传输到 MySql 数据库。

这是我用来批量复制多个表的帮助程序类(仅初始化一次)。执行 writeToServer() 会引发以下错误:“无法读取结果集。”没有任何进一步的信息。

    Private connStr As String
    Private conn As MySqlConnection
    Private blkInsert As MySqlBulkCopy
    Public ErrorMessage As String
    Public ErrorTableName As String

    Public Sub New()
        connStr = My.MySettings.Default.MyBaseConnectionString
        conn = New MySqlConnection(connStr)

        blkInsert = New MySqlBulkCopy(conn)
    End Sub

    Public Function WriteToMySql(destinationTableName As String, localTable As DataTable) As Boolean
        blkInsert.DestinationTableName = destinationTableName

        Try
            blkInsert.WriteToServer(localTable)
        Catch ex As Exception
            ErrorMessage = ex.Message
            ErrorTableName = destinationTableName
            Return False
        End Try

        Return True
    End Function
End Class

我将要复制到的表的名称以及包含数据的表传递给 WriteToMySql。

If Not (blkInsert.WriteToMySql("tb_vendor", Ds.Vendor) AndAlso
                blkInsert.WriteToMySql("tb_group", Ds.Group) AndAlso
                blkInsert.WriteToMySql("tb_subgroup", Ds.SubGroup) AndAlso
                blkInsert.WriteToMySql("tb_product", Ds.Product) AndAlso
                blkInsert.WriteToMySql("tb_product_attribute", Ds.Characteristic) AndAlso
                blkInsert.WriteToMySql("tb_product_attributes", productAttributes) AndAlso
                blkInsert.WriteToMySql("tb_encoded_names", productNamesEncoded) AndAlso
                blkInsert.WriteToMySql("tb_pictures", Ds.PictureNew) AndAlso
                blkInsert.WriteToMySql("tb_group_category", groupCategories)) Then
...

错误出现不一致,当出现这种情况时,重新执行(使用相同的表)没有帮助,它会触发相同的错误,就像表本身的问题一样。我正在插入 6 个表,包含最多行的表会引发该错误(始终是同一个表),而任何其他表都已成功复制。

修复错误的唯一方法是从 API 加载数据(重新初始化并重新填充表格)并尝试插入。大多数时候它可以正常工作而不会导致该错误,它会 super 随机地触发。

任何帮助将不胜感激,如果需要,我可以提供更多信息。 提前致谢。

编辑(回答问题):产生问题的数据表不超过 200k 行,但我已经尝试插入更大的表(2-3m 行)来检查如果它必须对大小进行处理,则不会出现错误。

当错误发生时,我看到 BulkCopy 插入了一部分行,然后抛出错误。基本上数据库上有插入的行,但不是全部。

Ds 是我从 API 填充的变量(数据集)的名称。其他独立表是我随后生成的,用于处理数据并生成所需的值。

我没有设置任何超时,但是在调试时我发现它等于0,这意味着无论需要多长时间它都应该等待。

我试图在调试时触发错误,它最近出现在发行版本上。当我这样做时,我将提供更多信息。

Edit2(堆栈跟踪和内部异常):

Failed to read the result set.

StackTrace:

   at MySqlConnector.MySqlDataReader.ActivateResultSet()
   at MySqlConnector.MySqlDataReader.<CreateAsync>d__97.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at MySqlConnector.Core.CommandExecutor.<ExecuteReaderAsync>d__0.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at MySqlConnector.MySqlCommand.<ExecuteNonQueryAsync>d__69.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at MySqlConnector.MySqlBulkLoader.<LoadAsync>d__73.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable`1.ConfiguredValueTaskAwaiter.GetResult()
   at MySqlConnector.MySqlBulkCopy.<WriteToServerAsync>d__29.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ValueTaskAwaiter`1.GetResult()
   at MySqlConnector.MySqlBulkCopy.WriteToServer(DataTable dataTable)
   at PolyBridge.BulkInsert.WriteToMySql(String destinationTableName, DataTable localTable)

内部异常:

Error during LOAD DATA LOCAL INFILE

最佳答案

尝试设置bulk copy timeout到一个很大的数字,比如一小时 3600 秒。

    blkInsert = New MySqlBulkCopy(conn)
    blkInsert.BulkCopyTimeout = 3600

您还可以通过此方法完全禁用超时

    blkInsert.BulkCopyTimeout = 0

关于mysql - 使用 BulkCopy 时出错(无法读取结果集),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65342090/

相关文章:

c# - .net 1.1 是否支持 64 位操作系统?

.net - 如何解决 "InvalidOperationException:operation must have a single parameter whose type is Stream"

vb.net - 我应该使用什么方法从数据集(SQL)中获取 3 个不同的节点(XML)?

mysql - 从 WordPress 数据库中提取数据 - 未知格式

php - 使用 MySQL 中的键将数组的 JSON 数组创建为单个 JSON 对象

mysql - 如何处理 mysql 中特定约束的错误?

asp.net - 运行进程时隐藏 vb.net 中的命令窗口

php - 使用 session 登录后重定向到报告页面

c# - 如何确定是否存在用于特定目的的开源软件?

c# - ASP.NET 无法使文件夹不可访问