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

news/2024/9/29 15:22:25

    最近在做一个工具改造,实现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没有空格后,数据就可以正常插入了。

 

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/56057.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

基于SIR模型的疫情发展趋势预测算法matlab仿真

1.程序功能描述 基于SIR模型的疫情发展趋势预测算法.对病例增长进行SIR模型拟合分析,并采用模型参数拟合结果对疫情防控力度进行比较。整体思路为采用SIR微分方程模型,对疫情发展进行过程进行拟合。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序Opt…

毕设开发日记第一阶段

第一阶段完成任务其实很简单,但是因为是第一次使用Unity,美术方面也可以说是零基础,我还是花费了好几天的时间在第一阶段的开发上面。 首先我确定是做一个2D的人物移动自由世界的游戏,所以我这边采用Unity作为游戏开发引擎,aseprite作为美术开发工具。 人物动画我刚开始尝…

Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

【日记】领导和领导之间差距还挺大(1223 字)

正文今天属实体验到了一波领导和领导之间的差距。7,8,9,10 号公休,今天省分行突然发通知,说信贷人员上岗资格考试 9.7 号下午考。我上午 10:30 从成都飞哈尔滨的机票。假条都批了。我跑去跟副行长汇报,副行长直接跟我说,那你能克服的还是克服一下,改签吧,考完再去公休。我…

2024Hvv漏洞汇总(128个POC)

2024年9月3日 Hvv情报搜集,漏洞合集全部都有POC(128个POC),可成功复现。2024Hvv漏洞整理(128个POC) ​(网上漏洞零零散散)下面是收集到的且有POC的漏洞整理合集,鄙人分了三种格式供各位提取,下面贴上目录与图片,由于字数有点大,各位请移步网盘自行提取。按照Hvv时间…

Spring boot 2.x集成swagger

1、官方文档2、历史版本安装 如果使用的不是最新的spring boot版本,则进入红框链接,打开历史版本列表。图片中也说明了springdoc-openapi v1.8.0 is the latest Open Source release supporting Spring Boot 2.x and 1.x.3、2.x版本文档 https://springdoc.org/v1/

初赛模拟题一

初赛模拟题一 T1 (C++ %)C++ "%" 的规则 \[a \% b = c \]\[c = a - \lfloor \frac{a}{b} \rfloor * b \]\(\lfloor \rfloor\) 的规则: 向 0 取整, 如 \((-9) / 5 = -1\),\(9 / 5 = 1\)T3 (GDB)GDB 全称“GNU symbolic debugger”,从名称上不难看出,它诞生于 GNU…