2015-01-22 12 views
4

내 컴퓨터에서 Excel 파일에 성공적으로 연결하는 다음 코드 (Windows Form의 일부)가 있지만 다른 상자에서는 실패합니다.OleDbException (0x80004005) : 알 수 없음

var fd = new OpenFileDialog(); 
if (fd.ShowDialog() == DialogResult.OK) 
{ 
    var extendedProperties = string.Empty; 
    if (fd.FileName.Contains(".xlsx")) 
    { 
     // excel 2007 xml format file, IMEX = import data as text avoids data conversion errors 
     extendedProperties = "Excel 12.0 Xml;IMEX=1"; 
    } 
    else if (fd.FileName.Contains(".xls")) 
    { 
     // excel 2003 format file, IMEX: import data as text avoids data conversion errors 
     extendedProperties = "Excel 8.0;IMEX=1"; 
    } 

    var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + fd.FileName + "';Extended Properties='" + extendedProperties + "'"; 
    using (var objXConn = new OleDbConnection(connectionString)) 
    { 
     objXConn.Open(); 

     var selectStatement = string.Format("SELECT * FROM [tabName$] WHERE FormType IS NOT NULL"); 
     var dataTable = new DataTable("test"); 
     using (var objCommand = new OleDbCommand(selectStatement, objXConn)) 
     { 
      var dataReader = objCommand.ExecuteReader(); 
      if (dataReader != null) 
      { 
       dataTable.Load(dataReader); 
      } 
     } 
     using (var stringWriter = new StringWriter()) 
     { 
      dataTable.WriteXml(stringWriter); 
      this.textBox1.Text = stringWriter.ToString(); 
     } 
    } 
} 

동작은 OleDbCommand.ExecuteReader()보다는 OleDbDataAdapter를 사용하여 재현.

using (var dataAdapter = new OleDbDataAdapter(selectStatement, objXConn)) 
{ 
    dataAdapter.Fill(dataTable); 
} 

실패하면, 내가/실행하는 x86 구성으로 프로그램을 작성할 때 다음과 같은 오류가 줄 dataTable.Load(dataReader);

에서 발생 점점 의미, 나는 다음과 같은 오류가 발생합니다.

System.Data.OleDb.OleDbException (0x80004005): Unknown 
    at System.Data.OleDb.OleDbDataReader.ProcessResults(OleDbHResult hr) 
    at System.Data.OleDb.OleDbDataReader.GetRowHandles() 
    at System.Data.OleDb.OleDbDataReader.ReadRowset() 
    at System.Data.OleDb.OleDbDataReader.Read() 
    at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping) 
    at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue) 
    at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) 
    at System.Data.Common.LoadAdapter.FillFromReader(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) 
    at System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler) 
    at ExcelTest.Form1.button1_Click(Object sender, EventArgs e) 
    at System.Windows.Forms.Control.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
    at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
    at System.Windows.Forms.Button.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

AnyCPU/x64 구성으로 프로그램을 실행/빌드 할 때 두 컴퓨터에서 다음 오류가 발생합니다.

테스트에 사용되는 Excel 파일은 두 컴퓨터에서 같은 파일입니다. 여러 파일 (모두 .xls ans .xlsx)을 사용하여 문제를 재현 할 수있었습니다.

문제점을 해결하기 위해 다음 사항을 시도했습니다.

다시 설치 이 문제를 해결 하시겠습니까?

+1

그래서 내가 뭔가 비슷한 지난주, 지난 우연히 내가 86을 실행하는 anycpu를에서 내 프로젝트 속성을 변경 .. 실제로에 날려 무엇 라인 그것은 비슷한 문제를 해결 .. – MethodMan

+0

@MethodMan 질문을 특정 줄로 업데이트했습니다. –

+1

두 컴퓨터에서 파일이 동일합니까? 오류는 dataTable.Load 호출에서 발생합니다. – Steve

답변

1

첫 번째 문제의 경우 OleDbDataAdapterFill() 메서드 또는 Update()입니다.

 DataTable newTbl = new DataTable() 
     using(OleDbDataAdapter ad = new OleDbDataAdapter(
      @"SELECT * FROM [tabName$] WHERE FormType IS NOT NULL", objXConn)) 
     { 
      OleDbCommandBuilder builder = new OleDbCommandBuilder(ad); 

      builder.QuotePrefix = "["; 
      builder.QuoteSuffix = "]"; 

      // Saves the data set 
      ad.Update(newTbl); 
     } 

32 비트 및 64 비트 응용 프로그램 용 OLEDB 드라이버는 다릅니다.

32 비트 드라이버 만 설치되어있는 경우 64 비트 응용 프로그램에서이 오류를 사용하려고하면 Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine 오류가 발생합니다. 마찬가지로 64 비트 버전 만 설치하고 32 비트 응용 프로그램을 사용하려고하면이 오류가 발생합니다.

무엇이 일어나고 있는지 이해하려면 응용 프로그램이 무엇인지 확인해야합니다. 이 라인이 도움이 될 것 같습니다 : Environment.Is64BitProcess

xls (Excel 2003) 파일에서 문제가 발생하면 JET 연결 문자열을 사용해보십시오!

이 편집 : 여기 모두 drivers에 대한 링크입니다 :

+0

Whare는'Fill' 또는'Update'와'Load'의 장점은 무엇입니까? 이 문제에 기여하고 있습니까? 나는 Fill으로이 문제를 재현 할 수 있었다. 나는'Update'를 시도 할 것입니다. 내가 설치 한 (32 비트 대 64 비트) 드라이버를 어떻게 확인할 수 있습니까? 나는 링크에서 그들을 설치했습니다. x86 또는 x64 버전이 작동하지 않아야합니다. 32 비트 및 64 비트 시스템 용 드라이버는 어디에서 찾을 수 있습니까? 나는'xls'과'xlsx' 파일에 대한 문제를 재현 할 수있었습니다. –

+0

여기 링크는 http://www.microsoft.com/en-us/download/details.aspx?id=13255 두 드라이버에 대한 링크입니다. x64에서 프로젝트를 실행할 때이 오류가 발생하기 때문에 x32 비트 드라이버가 있다고 가정합니다. – mybirthname

+0

32 비트 Office가 설치되어 있기 때문에 32 비트 버전을 사용해야했습니다. 위의 링크를 답에 추가 할 수 있습니까? 일단 설치하면 작동하는 것 같습니다. Load() 대신 OleDbDataAdapter 및 Fill() 메서드 또는 Update()를 사용하는 이유에 대한 세부 정보를 추가 할 수 있습니까? –