如何在.NET Core Docker容器中使用OdbcConnection读取CSV文件
问题根因
你当前安装的msodbcsql17是微软SQL Server专用的ODBC驱动,仅用于连接SQL Server数据库,代码中调用的Microsoft Access Text Driver是Windows平台独占的驱动,Linux环境下没有官方移植版本,所以会报驱动找不到的错误。
解决方案
方案1:使用Linux平台支持的CSV ODBC驱动
如果必须保留ODBC调用的代码逻辑,可以替换为Linux可用的CSV ODBC驱动,操作步骤如下:
- 安装对应驱动,以Debian/Ubuntu系基础镜像为例,执行安装命令:
apt update && apt install -y odbc-csv
如果是RHEL/CentOS系镜像,使用命令:
yum install -y csvodbc
- 修改
/etc/odbcinst.ini,新增CSV驱动配置项:
[CSV ODBC Driver] Description = ODBC driver for CSV files Driver = /usr/lib/x86_64-linux-gnu/odbc/libcsvodbc.so UsageCount = 1
注意:驱动路径根据实际安装位置调整,可以执行find / -name libcsvodbc.so查找系统中实际的驱动文件路径
3. 修改C#代码中的连接字符串,替换为新增的驱动名称:
string conSt = string.Format("Driver={{CSV ODBC Driver}};Dbq={0};Extensions=csv", fileSource);
方案2:替换为原生.NET CSV读取库(更推荐)
不需要调整系统ODBC配置,无跨平台依赖问题,性能更优,推荐使用CsvHelper这类成熟的.NET CSV处理库,操作步骤如下:
- 安装NuGet包:
dotnet add package CsvHelper
- 替换原有读取逻辑,示例代码:
using CsvHelper; using System.Globalization; using System.IO; var csvFilePath = Path.Combine(fileSource, $"{tableName}.csv"); using (var reader = new StreamReader(csvFilePath)) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { var records = csv.GetRecords<dynamic>(); foreach (var record in records) { Console.WriteLine("Inside"); // 直接通过record.字段名即可读取对应列的值 } }
内容的提问来源于stack exchange,提问作者oyeesh
相关产品推荐
相关产品推荐

