bulkinsertorupdateasync:从BCP客户端收到无效的列长度

发布于 2025-01-30 07:55:30 字数 2497 浏览 5 评论 0原文

因此,我正在运行以下代码:

await _internalDb.BulkInsertOrUpdateAsync(results, bulkConfig, (progress) =>
                {
                    log.BulkUpsertProgress(progress);
                });

我得到了以下例外:

Received an invalid column length from the bcp client for colid 4

现在我试图确定哪个列引起了此问题。因此,经过研究后,我遇到了这个网站: https://www.c-sharpcorner.com/blogs/received-invalid-column-column-length-from-bcp-client-for-for-volid-n1

现在我将上述代码包装到尝试捕获块:

try
            {
                await _internalDb.BulkInsertOrUpdateAsync(results, bulkConfig, (progress) =>
                {
                    log.BulkUpsertProgress(progress);
                });
            }
            catch (Exception ex)
            {
                string message = string.Empty;
                if (ex.Message.Contains("Received an invalid column length from the bcp client for colid"))

                {
                    string pattern = @"\d+";
                    Match match = Regex.Match(ex.Message.ToString(), pattern);
                    var index = Convert.ToInt32(match.Value) - 1;

                    FieldInfo fi = typeof(SqlBulkCopy).GetField("_sortedColumnMappings", BindingFlags.NonPublic | BindingFlags.Instance);
                    var sortedColumns = fi.GetValue(bulkcopy);
                    var items = (Object[])sortedColumns.GetType().GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(sortedColumns);

                    FieldInfo itemdata = items[index].GetType().GetField("_metadata", BindingFlags.NonPublic | BindingFlags.Instance);
                    var metadata = itemdata.GetValue(items[index]);
                    var column = metadata.GetType().GetField("column", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(metadata);
                    var length = metadata.GetType().GetField("length", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(metadata);
                    message = (String.Format("Column: {0} contains data with a length greater than: {1}", column, length));
                }
                return message;
            }

现在,我在这一点上停留的地方是如何更换块状副本。因此,我想做的是清楚地定义例外,并找出引起问题的列/值。任何帮助将不胜感激。

提前致谢

So I was running the following code:

await _internalDb.BulkInsertOrUpdateAsync(results, bulkConfig, (progress) =>
                {
                    log.BulkUpsertProgress(progress);
                });

And I got the following exception:

Received an invalid column length from the bcp client for colid 4

Now I am trying to determine what column is causing this problem. So after researching, I came across this site: https://www.c-sharpcorner.com/blogs/received-invalid-column-length-from-bcp-client-for-volid-n1

Now I wrapped the above code into a try catch block:

try
            {
                await _internalDb.BulkInsertOrUpdateAsync(results, bulkConfig, (progress) =>
                {
                    log.BulkUpsertProgress(progress);
                });
            }
            catch (Exception ex)
            {
                string message = string.Empty;
                if (ex.Message.Contains("Received an invalid column length from the bcp client for colid"))

                {
                    string pattern = @"\d+";
                    Match match = Regex.Match(ex.Message.ToString(), pattern);
                    var index = Convert.ToInt32(match.Value) - 1;

                    FieldInfo fi = typeof(SqlBulkCopy).GetField("_sortedColumnMappings", BindingFlags.NonPublic | BindingFlags.Instance);
                    var sortedColumns = fi.GetValue(bulkcopy);
                    var items = (Object[])sortedColumns.GetType().GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(sortedColumns);

                    FieldInfo itemdata = items[index].GetType().GetField("_metadata", BindingFlags.NonPublic | BindingFlags.Instance);
                    var metadata = itemdata.GetValue(items[index]);
                    var column = metadata.GetType().GetField("column", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(metadata);
                    var length = metadata.GetType().GetField("length", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(metadata);
                    message = (String.Format("Column: {0} contains data with a length greater than: {1}", column, length));
                }
                return message;
            }

Now, where I am stuck at this point is how to replace the BulkCopy. So what I would like to do is to clearly define the exception and find out what column/value is causing the problem. Any help is greatly appreciated.

Thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文