【问题标题】:How to read CSV files using OdbcConnection?如何使用 OdbcConnection 读取 CSV 文件?
【发布时间】:2021-10-12 02:50:12
【问题描述】:

我有一个 .NET 核心作为基础镜像的 docker 容器。我在app 下安装了几个 CSV 文件,我正在尝试通过建立OdbcConnection 来读取它们。

我已经安装了以下

unixODBC msodbcsql17 mssql-tools

这是我目前拥有的

fileSource = "/app/DataStore/FolderForCsvs";
string conSt = string.Format("Driver={{Microsoft Access Text Driver (*.txt, *.csv)}};Dbq={0};Extensions=asc,csv,tab,txt", fileSource);
var connectionString = new OdbcConnection(conSt);
string query = string.Format("SELECT * FROM `{0}`", tableName);
using (var odbcConnection = connectionString)
{
  odbcConnection.Open(); // errror
  using (var odbcCommand = new OdbcCommand(query, odbcConnection))
  {
      var dataReader = odbcCommand.ExecuteReader(CommandBehavior.CloseConnection);
      while (dataReader.Read())
      {
         Console.WriteLine("Inside");
      }
   }
}

我收到错误:

 ---> System.Exception: Exception in row row insert
 ---> System.Data.Odbc.OdbcException (0x80131937): ERROR [01000] [unixODBC][Driver Manager]Can't open lib 'Microsoft Access Text Driver (*.txt, *.csv)' : file not found
   at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
   at System.Data.Odbc.OdbcConnectionHandle..ctor(OdbcConnection connection, OdbcConnectionString constr, OdbcEnvironmentHandle environmentHandle)
   at System.Data.Odbc.OdbcConnectionOpen..ctor(OdbcConnection outerConnection, OdbcConnectionString connectionOptions)
   at System.Data.Odbc.OdbcConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)

以下是我的 odbc 设置:

[root@d5dc11d8c347 app]# odbcinst -j
unixODBC 2.3.7
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

[root@d5dc11d8c347 app]# cat /etc/odbcinst.ini
[ODBC Driver 11 for SQL Server]
Description=Microsoft ODBC Driver 11 for SQL Server
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-11.0.so.2270.0
Threading=1
UsageCount=1

[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.1.so.0.1
UsageCount=1

我不太确定 odbc 设置应该如何。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 为什么,当您无需数据库驱动程序即可将它们作为文件读取时,使用数十种流行的 csv 读取库中的任何一种,甚至是 file.readlines 和字符串拆分,如果您绝望/他们'很简单
  • @CaiusJard 谢谢。是的,这是我采取的第一条路径,不幸的是,在将数据加载到 DataTable 以获取可为空的 GUID 时,我在使用 CsvHelper 时遇到了问题。我想我会尝试这种方式,以便将所有内容都作为可以批量插入的字符串。
  • 您问过关于可空 guid 问题的问题吗?将这些指南作为字符串读取怎么样?或者编写自己的值转换器(很容易做到)
  • 是的,我做到了 (github.com/JoshClose/CsvHelper/discussions/1874)。您介意详细说明价值转换器吗?我想试试看。
  • 我回答了你之前的问题

标签: c# sql-server csv odbc


【解决方案1】:

要添加到@CaiusJard:Docker 容器中的 CSV 的 ODBC 正在采用日志方式。

只需使用(我很懒)来自 nuget 的 FileHelpers 将您的 csv 读取到对象列表甚至数据表中。如果 csv 布局文件未知,我还添加了一个使用 Filehelpers 的链接。数据表示例也在第二个链接中。

Filehelpers Example reading delimited file

Read unknown csv format

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 2019-08-27
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2018-09-07
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多