C# 转换为CSV时尝试读取或写入受保护内存

C# 转换为CSV时尝试读取或写入受保护内存,c#,oledb,C#,Oledb,我已经读过这个错误,但不知道如何修复。自动化简介: 我从应用程序中获得了一个包含html标记的.txt格式的文件 我必须将此文件转换为csv,并在将其传递到最终目的地之前修改一些标题 为了方便起见,我通过OleDB连接到文本文件 到目前为止,我处理了数百个文件,其中1%的文件出现了这个错误 我已经将代码分割为只运行此代码,以消除代码中的其他潜在错误 我添加了以下内容,以允许它进入错误处理过程,但当我尝试将文件移动到错误日志文件夹时,错误仍然存在 [System.Runtime.Exception

我已经读过这个错误,但不知道如何修复。自动化简介:

  • 我从应用程序中获得了一个包含html标记的.txt格式的文件

  • 我必须将此文件转换为csv,并在将其传递到最终目的地之前修改一些标题

  • 为了方便起见,我通过OleDB连接到文本文件

  • 到目前为止,我处理了数百个文件,其中1%的文件出现了这个错误

  • 我已经将代码分割为只运行此代码,以消除代码中的其他潜在错误

  • 我添加了以下内容,以允许它进入错误处理过程,但当我尝试将文件移动到错误日志文件夹时,错误仍然存在
  • [System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute()]

    任何帮助都是很有吸引力的

    下面是一段代码片段

        public static void ConvertExcelToCsv(string excelFilePath, string csvOutputFile, string fileExtType, int worksheetNumber = 1,  bool SQLDataInsert = false)
        {
    
          switch (fileExtType)
            {
                 case ".txt":
                        cnnStr = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"HTML Import;IMEX=1;HDR=NO\"", excelFilePath);
                   break;
                default:
                    cnnStr = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO\"", excelFilePath);
                    break;
            }
           var cnn = new OleDbConnection(cnnStr);  
           var dt = new DataTable();
           try
            {
                cnn.Open();  // fails here
                string worksheet = schemaTable.Rows[worksheetNumber - 1]["table_name"].ToString().Replace("'", "");
                string sql = String.Format("select * from [{0}]", worksheet);
                var da = new OleDbDataAdapter(sql, cnn);
                da.Fill(dt);
            }
            catch (Exception e)
            {
                 cnn.Dispose();
                 GeneralFunctions.DisplayTextConsole("Error received trying to process File: " + excelFilePath.ToString(), ConsoleColor.Red, ConsoleColor.White, false);
                 File.Move(excelFilePath, Constant._ErrorFileDir + @"\" + Path.GetFileName(ErrFileName));
             }
          }
    

    您能提供一些示例文件吗?
    cnn.Dispose()
    应该在
    finally
    块中,而不是
    catch
    块中。虽然我认为这对解决问题没有帮助,但请检查以下文件夹中的msadox.dll文件。版本应与连接字符串中的oledb版本号匹配:C:\Program Files\Common Files\system\A谢谢您的评论。我不能提供文件样本,因为它们是内部文件。我怀疑文件不同,但我无法通过手动查看区分两者。我拥有的dll文件是该文件夹中的msado15.dll。此错误会导致应用程序物理崩溃,但不会发生。我可以处理1%的故障率,但我只需要编码来释放文件,这样我就可以将其移到一边。如果您注释掉
    cnn.Open()
    ,让dataadapter负责打开(并随后自动关闭)连接,错误是否发生在另一行?能否提供一些示例文件?
    cnn.Dispose()
    应该位于
    finally
    块中,而不是
    catch
    块中。虽然我认为这对解决问题没有帮助,但请检查以下文件夹中的msadox.dll文件。版本应与连接字符串中的oledb版本号匹配:C:\Program Files\Common Files\system\A谢谢您的评论。我不能提供文件样本,因为它们是内部文件。我怀疑文件不同,但我无法通过手动查看区分两者。我拥有的dll文件是该文件夹中的msado15.dll。此错误会导致应用程序物理崩溃,但不会发生。我可以处理1%的故障率,但我只需要编码来释放文件,这样我就可以将其移到一边。如果您注释掉
    cnn.Open()
    ,让dataadapter负责打开(并随后自动关闭)连接,错误是否会发生在另一行?