我开发了一个 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 加载数据(重新初始化并重新填充表)并尝试插入。大多数情况下,它不会导致该错误,它会触发超级随机。
任何帮助将不胜感激,如果需要,我可以提供更多信息。提前致谢。
编辑(对问题的回答):产生问题的数据表包含不超过 200k 行,但我已经尝试插入更大的表(2-3m 行)以检查它是否必须与大小有关,不存在错误。
当错误发生时,我看到 BulkCopy 插入了一部分行,然后抛出了错误。基本上数据库上有插入的行,但不是全部。
Ds 是我从 API 填写的变量(数据集)的名称。其他独立表由我随后生成,用于处理数据和生成所需值。
我没有设置任何超时,但是在调试时我看到它等于 0,这意味着无论需要多长时间它都应该等待。
我试图在调试时触发错误,它最近出现在发布版本上。当我这样做时,我会提供更多信息。
Edit2(堆栈跟踪和内部异常):
Failed to read the result set.
堆栈跟踪:
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