【问题标题】:Reading A Fixed Format Text File - Part 2读取固定格式的文本文件 - 第 2 部分
【发布时间】:2012-01-30 13:25:03
【问题描述】:

这是question:的后续问题

我正在尝试使用 Microsoft.ACE.OLEDB.12.0 Provider 读取固定格式文本文件。我有六种不同的方法来设置驱动程序和/或提供程序,并且几乎每次都遇到相同的问题。由于“找不到可安装的 ISAM”异常或驱动程序的错误和异常,我什至无法“开始”。

系统安装了 Office 2007,因此“找不到可安装的 ISAM”没有多大意义。

有人看到下面代码的问题吗?

string DATABASE_PROVIDER = "Provider=Microsoft.ACE.OLEDB.12.0";
string CVS = Application.StartupPath + @"\Data.txt";
string connectionString = DATABASE_PROVIDER = ";Data Source=" + CVS +";Extended Properties=text;HDR=Yes;FMT=Fixed";
string field ="*";
string table ="Data";
string StringQueryCMD = "SELECT" + field+" FROM " + table;
OleDbConnection myConnection = new OleDbConnection( connectionString );
OleDbCommand cmd = myConnection.CreateCommand();
cmd.CommandText = StringQueryCmd;
myConnection.Open(); // <---- "Could not find installable ISAM" exception here
OleDataAdapter myDataAdapter = new OleDbDataAdapter(cmd);
DataTable Table = new DataTable("Data");// <---- "Could not find installable ISAM" exception here

myDataAdapter.Fill(Table);

【问题讨论】:

  • 我自己解决了这个问题。我将在接下来的 3 小时内发布问题的解决方案并尝试解释解决方案。归根结底,我看到的几乎所有示例实际上都是错误的。
  • 我给了你一个赞成票...希望对你有帮助 =) 哈哈
  • 由于我在Superuser 上的活动,我在 SO 上的问题连续被否决越来越荒谬。如果您对我所说的内容有疑问,请在聊天中与我交谈,不要在 StackoverflowSuperuser 上连续投票给我,因为它只会无论如何都会被逆转
  • 请在投票时留下评论,我不想因为一些随机的人自尊受到伤害而将这个问题与我的帐户断开连接! 5 票反对,没有一条评论

标签: c# c#-4.0 oledb


【解决方案1】:

我会使用FileHelpers 库来读取固定长度的文件,而不是使用 ADO.Net。

更新 在那种情况下,我 认为 你需要一个 ini 文件以及定义 txt 文件的 txt 文件。列宽、名称等。

另一种选择是完全放弃 ado.net 并创建一个简单的固定长度文件阅读器。

var file = new FileInfo("path");
using(var reader = file.Open())
while(reader.Read())
{
   //parse the line
   yield return the object representing the parsed line.
}

【讨论】:

    【解决方案2】:

    我最终选择了一个稍微不同的解决方案。 “找不到可安装的 ISAM”异常的解决方案是使用以下内容:

    string EXTENDED_PROPERTIES = @"Extended Properties=""Text;HDR=YES;FMT=FixedLength;""";
    

    解决方案的关键是“扩展属性”值周围的 "(s)。我能够用文件的内容填充 DataTable,我认为存在问题ini 文件,所以它包含“-----”字符串,这对我来说没用。

    所以我最终只是简单地读取了访问数据库。

    string DATABASE_PROVIDER = "Provider=Microsoft.ACE.OLEDB.12.0";
    string CVS Application.StartupPath + ""\\Database.accdb";
    string DATA_SOURCE = "Data Source" + CVS;
    string connectionString = DATABASE_PROVIDER + DATA_SOURCE;
    string TABLE = " FROM STUFF";
    string SELECT = "SELECT CODE, NAME, ICON, FUNCTION;
    string StringQueryCmd = SELECT + TABLE;
    
    OleDbConnection MyConnection = new OleDbConnection(connectionString);
    OleDbCommand Command = OleDbCommand(StringQueryCmd,MyConnection);
    OleDbAdapter MyDataAdapter = new OleDbAdapter(Command);
    DataSet MyDataSet = new DataSet();
    DataTable MyDataTable = new DataTable();
    MyConnection.Open();
    MyDataAdapter.Fill(MyDataSet,"STUFF");
    MyConnection.Close();
    

    一旦有了 DataTable,理论上您就可以使用 LINQ to DataSet 而不是处理 DataTable。

    【讨论】:

      猜你喜欢
      • 2012-02-26
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 2016-01-18
      • 1970-01-01
      相关资源
      最近更新 更多