c# - 无法从 excel 列中读取字符串值
问题描述
SSIS脚本任务仅读取excel的数值但无法读取同一列中存在的字母数字值
我试过使用 IMEX=0、IMEX=1 和 IMEX=2。但是字母数字值在我的 SQL 服务器表中生成为 NULL。
//Excel Connection String
string ConStr;
ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
fileFullPath + ";Extended Properties=\"Excel 12.0;HDR=" + HDR +
";IMEX=0\"";
如果第 8 列“A”值是整数 (0,1,2,3,4,5,6,7),然后在下面的行中出现字母数字 (A,B,ABQX345) 值,那么它应该读取所有值原样并插入到 SQL Server 表中
0,1,2,3,4,5,6,7,A,B,ABQX345
解决方案
此问题与用于读取 excel 文件的 OLEDB 提供程序有关:由于 excel 不是每列都有特定数据类型的数据库,因此 OLEDB 提供程序会尝试识别在每列中找到的主要数据类型并替换所有其他不能的数据类型用 NULL 解析。
网上有很多文章讨论这个问题并提供了几种解决方法(下面列出的链接)。
但是在使用 SSIS 多年之后,我可以说最好的做法是将 excel 文件转换为 csv 文件并使用 Flat File components 读取它们。
或者,如果您没有选择将 excel 转换为平面文件,那么您可以强制 excel 连接管理器忽略第一行的标题,但添加HDR=NO
到连接字符串并添加IMEX=1
以告诉 OLEDB 提供程序从第一个指定数据类型行(这是标题 - 大多数时间都是字符串),在这种情况下,所有列都作为字符串导入,并且没有值被 NULL 替换,但是您将丢失标题和额外的行(导入标题行)。
如果您不能忽略标题行,只需在标题行之后添加一个包含虚拟字符串值(例如aaa
:)的虚拟行并添加IMEX=1
到连接字符串。
SchemaMapper Excel 导入类
此外,最好检查以下属于 SchemaMapper 项目的类,我实现了上述逻辑以解决此问题:
有用的网址
推荐阅读
- go - 用于服务间通信的基于 gRPC 的微服务架构
- javascript - 将函数 prop 传递给子组件(通过 Link 和 Route 组件)
- xamarin.forms - 如何在 Xamarin iOS 和 Android 在管道中构建任务之前替换 json 配置值
- python - 将二维向量多次添加到另一个二维向量的有效方法
- angular - 已选择 Angular 自动完成输入并模糊事件竞争条件
- python - 如何将 Meteor 链接到 Opencv python
- mysql - 从 SQL 中的短日期格式中提取数字日期值
- javascript - 使用具有可变字段的数据解析 JSON
- python - 在 iOS/Pythonista 上运行 Scrapy?
- javascript - 如何在javascript中的if else语句中检查parentNode classList