none
.net使用Microsoft.Jet.OLEDB.4.0發生「請安裝 Microsoft Data Access Components(MDAC) 2.6 版或更新的版本 發生下列錯誤,為具有 CLSID {2206CDB2-19C1-11D1-89E0-00C04FD7A829} 的元件擷取 COM Class Factory 失敗: 800700c1。」 RRS feed

  • 問題

  • 請問各位先進,小弟使用.net透過jet ole讀取Excel資料時,發生以下的錯誤,請問是否有什麼方式可以解決呢? 感謝各位,謝謝!

    環境說明:

    作業系統版本-
    Windows 2008 64 bit

    開發工具版本-
    Visual Studio 2010 C# Express

    開發環境-
    .net 4.0 Windows Form x86

    錯誤訊息與狀況描述-
    System.InvalidOperationException: The .Net Framework Data Providers require Microsoft Data Access Components(MDAC).  Please install Microsoft Data Access Components(MDAC) version 2.6 or later. ---> System.BadImageFormatException: Retrieving the COM class factory for component with CLSID {2206CDB2-19C1-11D1-89E0-00C04FD7A829} failed due to the following error: 800700c1  不是正確的 Win32 應用程式 。 (Exception from HRESULT: 0x800700C1).
       at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
       at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
       at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
       at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly)
       at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
       at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
       at System.Data.OleDb.OleDbConnectionInternal.CreateInstanceDataLinks()
       at System.Data.OleDb.OleDbConnectionInternal.GetObjectPool()
       --- End of inner exception stack trace ---
       at System.Data.OleDb.OleDbConnectionInternal.GetObjectPool()
       at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
       at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       at System.Data.OleDb.OleDbConnection.Open()
       at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
       at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
       at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
       at WinJetx64.Form1.button1_Click(Object sender, EventArgs e) in F:\WinJetx64\WinJetx64\Form1.cs:line 25
       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)


    ************** Loaded Assemblies **************
    mscorlib
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 (RTMRel.030319-0100)
        CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
    ----------------------------------------
    WinJetx64
        Assembly Version: 1.0.0.0
        Win32 Version: 1.0.0.0
        CodeBase: file:///C:/Program%20Files%20(x86)/Galaxy%20Software%20Services/WinJetx64/WinJetx64/bin/Debug/WinJetx64.exe
    ----------------------------------------
    System.Windows.Forms
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 built by: RTMRel
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
    ----------------------------------------
    System.Drawing
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 built by: RTMRel
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
    ----------------------------------------
    System
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 built by: RTMRel
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
    ----------------------------------------
    System.Data
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 (RTMRel.030319-0100)
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll
    ----------------------------------------
    System.Core
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 built by: RTMRel
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
    ----------------------------------------
    System.Xml
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 built by: RTMRel
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
    ----------------------------------------
    System.Transactions
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 (RTMRel.030319-0100)
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Transactions/v4.0_4.0.0.0__b77a5c561934e089/System.Transactions.dll
    ----------------------------------------

    改成.net 2.0 錯誤如下,


    ************** 例外狀況文字 **************
    System.InvalidOperationException: .Net Framework Data Provider 需要 Microsoft Data Access Components(MDAC)。請安裝 Microsoft Data Access Components(MDAC) 2.6 版或更新的版本。 ---> System.BadImageFormatException: 由於發生下列錯誤,為具有 CLSID {2206CDB2-19C1-11D1-89E0-00C04FD7A829} 的元件擷取 COM Class Factory 失敗: 800700c1。
       於 System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
       於 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
       於 System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
       於 System.RuntimeType.CreateInstanceImpl(Boolean publicOnly)
       於 System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
       於 System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
       於 System.Data.OleDb.OleDbConnectionInternal.CreateInstanceDataLinks()
       於 System.Data.OleDb.OleDbConnectionInternal.GetObjectPool()
       --- 內部例外狀況堆疊追蹤的結尾 ---
       於 System.Data.OleDb.OleDbConnectionInternal.GetObjectPool()
       於 System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
       於 System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
       於 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
       於 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       於 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       於 System.Data.OleDb.OleDbConnection.Open()
       於 System.Data.Common.DbDataAdapter.QuietOpen(IDbConnection connection, ConnectionState& originalState)
       於 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
       於 System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
       於 System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
       於 WinJetx64.Form1.button1_Click(Object sender, EventArgs e) 於 P:\Example\WinJetx64\WinJetx64\Form1.cs: 行 25
       於 System.Windows.Forms.Control.OnClick(EventArgs e)
       於 System.Windows.Forms.Button.OnClick(EventArgs e)
       於 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       於 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       於 System.Windows.Forms.Control.WndProc(Message& m)
       於 System.Windows.Forms.ButtonBase.WndProc(Message& m)
       於 System.Windows.Forms.Button.WndProc(Message& m)
       於 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       於 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       於 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


    ************** 已載入的組件 **************
    mscorlib
        組件版本: 2.0.0.0
        Win32 版本: 2.0.50727.4016 (NetFxQFE.050727-4000)
        程式碼基底: file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
    ----------------------------------------
    mscorlib.resources
        組件版本: 2.0.0.0
        Win32 版本: 2.0.50727.4016 (NetFxQFE.050727-4000)
        程式碼基底: file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
    ----------------------------------------
    WinJetx64
        組件版本: 1.0.0.0
        Win32 版本: 1.0.0.0
        程式碼基底: file:///C:/Program%20Files%20(x86)/Galaxy%20Software%20Services/WinJetx64/WinJetx64.exe
    ----------------------------------------
    System.Windows.Forms
        組件版本: 2.0.0.0
        Win32 版本: 2.0.50727.4016 (NetFxQFE.050727-4000)
        程式碼基底: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
    ----------------------------------------
    System
        組件版本: 2.0.0.0
        Win32 版本: 2.0.50727.4016 (NetFxQFE.050727-4000)
        程式碼基底: file:///C:/Windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
    ----------------------------------------
    System.Drawing
        組件版本: 2.0.0.0
        Win32 版本: 2.0.50727.4016 (NetFxQFE.050727-4000)
        程式碼基底: file:///C:/Windows/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
    ----------------------------------------
    System.Windows.Forms.resources
        組件版本: 2.0.0.0
        Win32 版本: 2.0.50727.4016 (NetFxQFE.050727-4000)
        程式碼基底: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_zh-CHT_b77a5c561934e089/System.Windows.Forms.resources.dll
    ----------------------------------------
    System.Data
        組件版本: 2.0.0.0
        Win32 版本: 2.0.50727.4016 (NetFxQFE.050727-4000)
        程式碼基底: file:///C:/Windows/assembly/GAC_32/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
    ----------------------------------------
    System.Xml
        組件版本: 2.0.0.0
        Win32 版本: 2.0.50727.4016 (NetFxQFE.050727-4000)
        程式碼基底: file:///C:/Windows/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
    ----------------------------------------
    System.Transactions
        組件版本: 2.0.0.0
        Win32 版本: 2.0.50727.4016 (NetFxQFE.050727-4000)
        程式碼基底: file:///C:/Windows/assembly/GAC_32/System.Transactions/2.0.0.0__b77a5c561934e089/System.Transactions.dll
    ----------------------------------------
    System.Data.resources
        組件版本: 2.0.0.0
        Win32 版本: 2.0.50727.4016 (NetFxQFE.050727-4000)
        程式碼基底: file:///C:/Windows/assembly/GAC_MSIL/System.Data.resources/2.0.0.0_zh-CHT_b77a5c561934e089/System.Data.resources.dll
    ----------------------------------------


    錯誤的片段程式碼-

    string fileName = @"c:\test.xls";
    string xlsConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + @";Extended Properties=""Excel 8.0;HDR=NO;IMEX=1;""";
    System.Data.OleDb.OleDbDataAdapter xlsDA = new System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", xlsConn);
    System.Data.DataTable xlsDT = new System.Data.DataTable();
    xlsDA.Fill(xlsDT);  //死在這一行
    dataGridView1.DataSource = xlsDT;
    


     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已編輯 亂馬客 2011年10月26日 上午 03:21
    2011年10月26日 上午 03:16

解答

  • 有上到 SP2 了嗎?

    因為 MDAC 2.6 是內建元件,不准額外安裝...如果還是不行,可能就要重灌了。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    • 已標示為解答 亂馬客 2011年10月28日 上午 09:08
    2011年10月26日 上午 05:03
    版主
  • MDAC 目前只會伴隨安全性更新而更新。

    安裝 SQL 2008 只會新增 SQL Server 專用的 driver ,並不會影響到 MDAC 。

    你可以考慮安裝 Access Runtime 引擎,會有新版的 odbc / oledb ,你可以修改連線字串改用那個試試看。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 亂馬客 2011年10月28日 上午 09:08
    2011年10月27日 下午 03:05

所有回覆

  • 請用 x86 模式編譯你的程式,再放到 64 位元機器上執行。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    • 已提議為解答 Bill ChungMVP 2011年10月26日 上午 04:28
    2011年10月26日 上午 04:13
    版主
  • 小朱大您好,小弟已用x86模式編譯了!

    因為用x64模式編譯的錯是類別未登錄的錯!
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年10月26日 上午 05:02
  • 有上到 SP2 了嗎?

    因為 MDAC 2.6 是內建元件,不准額外安裝...如果還是不行,可能就要重灌了。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    • 已標示為解答 亂馬客 2011年10月28日 上午 09:08
    2011年10月26日 上午 05:03
    版主
  • 嗯,已是Win 2008 Std Sp2了!

    只是好奇,在Win 2008 R2版就沒這個問題!

    用Process Moniter來看,都有到註冊檔取2206CDB2-19C1-11D1-89E0-00C04FD7A829這個Key說!

    只是跟正常(win 2008 R2 x64)的程式比起來,正常的程式好像讀2206CDB2-19C1-11D1-89E0-00C04FD7A829這個資訊比較多次!

    請參考下圖,謝謝!

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年10月26日 上午 06:08
  • WinXP SP2 以後,均內建 MDAC 2.82 以後版本。

    MDAC 可下載的最後版本 MDAC 2.81 ,是給 Win2k / WinXP SP1 以前版本使用。

    ADO.NET 2.0 以後,要求 MDAC 2.81 以後版本。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月26日 下午 02:39
  • 您好,

    請問Win 2008要重裝MDAC的方式是否要裝SQL 2008才會重裝呢?

    目前找了另外一台相同的VM,還是無法重現該問題,看來如沒有辦法,可能要像朱大說的重裝OS了!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年10月27日 上午 10:42
  • MDAC 目前只會伴隨安全性更新而更新。

    安裝 SQL 2008 只會新增 SQL Server 專用的 driver ,並不會影響到 MDAC 。

    你可以考慮安裝 Access Runtime 引擎,會有新版的 odbc / oledb ,你可以修改連線字串改用那個試試看。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 亂馬客 2011年10月28日 上午 09:08
    2011年10月27日 下午 03:05
  • 您是指Jet改用ODBC Driver嗎?

    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + @";Extended Properties=""Excel 8.0;HDR=NO;IMEX=1;

    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年10月28日 上午 02:42
  • 你回的是 oledb 連線字串,而非 odbc 連線字串。

    新版的 oledb 字串應改為:

    Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Path\file.xls;Extended Properties="Excel 8.0;HDR=YES"


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月28日 下午 03:56