首页 > 编程语言 >[编程笔记] 从 bcp 客户端收到一个对 colid 7 无效的列长度

[编程笔记] 从 bcp 客户端收到一个对 colid 7 无效的列长度

时间:2024-09-03 11:52:33浏览次数:8  
标签:tran dataSource colid RID bcp DataTable Columns 客户端

    最近在做一个工具改造,实现A库数据导B库的功能。今天遇到一个奇怪问题,“从 bcp 客户端收到一个对 colid 7 无效的列长度”。

    代码是从A库执行SELECT语句到本地DataTable,再将DataTable插入到B库,插入的过程是通过SqlBulkCopy实现的,这样做的好处是不用写INSERT语句,只要DataTable的列名和B库表中列名一致,则传入DataTable直接插入即可。

    这里贴一下工具方法,有需要的可以参考一下:

public class DataHandler
{
    /// <summary>
    /// 把DataTable中数据快速插入指定表中
    /// </summary>
    /// <param name="connectionString">目标连接字符</param>
    /// <param name="tableName">目标表(数据库表名)</param>
    /// <param name="dataSource">源数据</param>
    public void SqlBulkCopyByDatatable(string connectionString, string tableName, DataTable dataSource, ref string msg)
    {
        SqlTransaction tran = null;//声明一个事务对象
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();
            using (tran = conn.BeginTransaction())
            {
                using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran))
                {
                    try
                    {
                        sqlbulkcopy.DestinationTableName = tableName;
                        sqlbulkcopy.BatchSize = 100;
                        // 这里的Dt处理一下,删掉RID,避免列不一致导致插入失败
                        if (dataSource.Columns.Contains("RID"))
                        {
                            dataSource.Columns.Remove("RID");
                        }
                        // 设置列映射
                        for (int i = 0; i < dataSource.Columns.Count; i++)
                        {
                            sqlbulkcopy.ColumnMappings.Add(dataSource.Columns[i].ColumnName, dataSource.Columns[i].ColumnName);
                        }
                        sqlbulkcopy.WriteToServer(dataSource);
                        tran.Commit();
                    }
                    catch (Exception ex) 
                    {
                        msg = ex.Message;
                        tran.Rollback();
                    }
                }
            }
        }
    }
}

    dt有个RID,是因为外层我的查询字符串处理了根据RID处理了分页,所以这里插入前处理下这个列,下面的设置列映射很好用,如果不映射的话默认是一列一列对齐插入的,遇到表字段非常多的情况,写起来很麻烦。

    言归正传,“从 bcp 客户端收到一个对 colid 7 无效的列长度”,这个错误是怎么来的呢?看现象是DataTable和表之间数据长度不一致,我的DataTable如下:

    colid 7,我原本一位是d_branch_no字段,因为从0开始数的话,索引为7的刚好是d_branch_no,所以分析是这个列没有值导致报错。后面发现不是。

    colid 7是指DataTable的第7列,从1开始数!初看branch_no是没有问题的,我们数据库这个字段在我现在要用的表里就是6位,那为什么报错呢?

    眼睛看了好久看不出来,把查DataTable的语句在查询分析器中通过INSERT INTO ... SELECT ... FROM 的形式执行是正常的,这可就难到我了。这种问题一般就是某个细节没注意到,和预期不一致导致问题产生。

    果然,我想起我们系统里的“历史债务”,很多表的字段用的char类型,char类型当位数不足时自动用空格补齐内容。

    比如field字段设计的是char(6),如果field存进去的是00,那么这个字段在数据库的值是 “00    ”,而非 “00”,所以查询的时候如果没有考虑空格,那么就会出现和预期不一致的现象,一些奇怪的bug由此而生!

    在前面的笔记中提到过,数据库字段设计为char类型是历史债务,现在不适合改类型,影响面太广。因此这里的做法是查询的时候使用rtrim把空格去掉,这样DataTable没有空格后,数据就可以正常插入了。

 

    小结:空格防不胜防,只能自己多加小心了。

 

标签:tran,dataSource,colid,RID,bcp,DataTable,Columns,客户端
From: https://www.cnblogs.com/sunshine-wy/p/18394264

相关文章

  • 用 `paho-mqtt` 客户端连接 RabbitMQ 并发布和订阅消息
    在Python中,使用MQTT客户端连接RabbitMQ可以通过paho-mqtt库来实现。RabbitMQ必须启用MQTT插件,这样才能作为一个MQTTBroker工作。以下是一个完整的Python示例,用paho-mqtt客户端连接RabbitMQ并发布和订阅消息。步骤1:启用RabbitMQ的MQTT插件在R......
  • keycloak~scope客户端模板的使用
    scope为何物?scope在oauth2中表示授权的范围,另外也可以理解为,根据认证时scope的参数,在构建jwt时,返回更多的信息;比如在keycloak中,你的可选scope(optionalscope)中添加了address这个模板,当你通过/auth/realms/{realmId}/protocol/openid-connect/token进行认证时,你的参数scope中出......
  • NetSarang Xshell(SSH客户端软件) v7.0.0169 中文绿色版
    概述NetSarangXshell破解版是一款免费SSH客户端软件的Linux远程监控工具.Xshell中文版,轻松管理远程主机服务器,会话管理器,支持多选项卡管理主机.Xftp7最新版以及Xshell7最新版支持远程协议Telnet,Rlogin,SSH/SSHPKCS#11,SFTP,Serial,具有Unicode编码支持,动态端口转发,自定......
  • Steamui.dll守护指南:Steam客户端遭遇迷失时的自助恢复之旅
    Steamui.dll丢失应该如何处理?很多朋友还不是特别的清楚,解决Steamui.dll丢失的问题,可以按照以下步骤操作:1.重新安装Steam客户端:最直接的方法是卸载当前的Steam客户端,然后从官方网站重新下载安装包进行安装。这会自动替换所有丢失或损坏的文件,包括Steamui.dll。2.文件恢复:若......
  • golang使用http客户端 多个协程同时请求接口
    packagemainimport( "encoding/json" "fmt" "io" "net/http" "net/url" "sync")typeApiResponsestruct{ Codeint`json:"code"` Msgstring`json:"msg&qu......
  • 神策SDK不支持Windows客户端全埋点,怎么实现用户统计分析?
    本文将介绍,ClkLog针对神策不支持全埋点的客户端实现用户访问基础统计分析-1。● ClkLog客户遇到的问题ClkLog的用户访问基础统计分析功能是基于神策SDK的全埋点来实现的。我们遇到有些客户是使用C++、C#等语言来开发的客户端,然而神策此类SDK(如C++,C#等)仅提供自定义事件埋点,并未......
  • 神策SDK不支持Windows客户端全埋点,怎么实现用户统计分析?
    本文将介绍,ClkLog针对神策不支持全埋点的客户端实现用户访问基础统计分析-1。● ClkLog客户遇到的问题ClkLog的用户访问基础统计分析功能是基于神策SDK的全埋点来实现的。我们遇到有些客户是使用C++、C#等语言来开发的客户端,然而神策此类SDK(如C++,C#等)仅提供自定义事件埋点,并未......
  • 【QA-MISRA】在客户端如何修改当前用户的密码
    【更多软件使用问题请点击亿道电子官方网站】无法登录QAMISRAController的情况下如何修改当前用户的密码问题1、文档目标解决无法登录QAMISRAController的情况下如何修改当前用户的密码问题。2、问题场景由于客户实行集中式管理,QA-MISRAController开发人员无权登录......
  • EventSource事件流(允许网页与服务器之间建立一个持久的连接,服务器可以通过这个连接向
     EventSource是JavaScript中用于处理服务器发送事件(Server-SentEvents,SSE)的接口。它允许网页与服务器之间建立一个持久的连接,服务器可以通过这个连接向客户端推送更新。EventSource通常用于需要实时更新数据的场景,比如实时通知、股票价格更新等。 基本用法//创建一......
  • Eureka与Ribbon的协作:实现客户端负载均衡的详细指南
    Eureka与Ribbon的协作:实现客户端负载均衡的详细指南引言在现代微服务架构中,负载均衡是保证系统高可用性和性能的重要技术之一。随着服务实例的数量和动态变化,如何高效地分发请求成为一个关键问题。SpringCloud提供了Eureka和Ribbon这两项强大的工具,Eureka负责服务发现,而R......