FIX: ADO 將資料插入 Excel 中的錯誤資料行

文章翻譯 文章翻譯
文章編號: 314763 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

如果資料包括包含空字串值的欄位,您可以使用,將新的資料列插入 Microsoft Excel 工作表的 ADO 時, ADO 可能插入錯誤的資料行,在 Excel 中的後續的數字欄位的資料值。

在 Microsoft OLE DB 提供者的 Jet 版本 4.0 與 Excel 的 Microsoft ODBC 驅動程式,就會發生這個問題。就會發生這個問題,您使用 SQL INSERT 陳述式] 或 [AddNew] 和 [ADO 資料錄集 物件的 Update 方法。

如果 Excel 活頁簿是在 Excel 應用程式中開啟,ADO 插入新記錄時,不會發生這個問題。

不過,Microsoft 阻礙這個練習中,因為如果 ADO 作業期間開啟 Excel,就會發生記憶體遺漏。 如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
319998當查詢使用 ADO 開啟 Excel 工作表時,注意: 記憶體遺漏
請參閱 < 其他相關資訊 > 一節,如需有關這個問題發生的情況的詳細資訊。

解決方案

如果要解決這個問題,取得最新的 Service Pack 的 Jet 4.0 Service Pack。如需詳細資訊按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
239114如何: 取得最新的 Service Pack,為 Microsoft Jet 4.0 資料庫引擎

狀況說明

Microsoft 已確認這是在本文開頭所列之 Microsoft 產品中的有錯誤。

其他相關資訊

重製行為的步驟

  1. 開啟 Microsoft Excel,然後建立新的活頁簿。
  2. 在 Sheet1,輸入開頭在左上角的儲存格 A1 與下列範例資料:
    摺疊此表格展開此表格
    ColumnAColumnBColumnCColumnDColumnEColumnF
    11測試11測試
    22測試22測試

  3. 將活頁簿儲存為 Test.xls。您可以讓 Excel 應用程式開啟,但您必須關閉新的活頁簿。
  4. 在 [Microsoft Visual Basic,建立新的標準執行檔專案。預設會建立 Form1。
  5. 按一下 [專案] 功能表 引用項目。從可用的參考清單,選取 Microsoft ActiveX 資料物件 2 x
  6. 放在 Form1,指令按鈕 控制項,然後將下列程式碼貼在 Click 事件程序] 按鈕。注意這段程式碼將為空字串插入至中間欄欄 C.
    Private Sub Command1_Click()
       Dim strCn As String
       Dim cn As ADODB.Connection
       Dim rs As ADODB.Recordset
       Dim fld As ADODB.Field
    
       'Open connection
       strCn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & App.Path & "\Test.xls;" & _
          "Extended Properties=Excel 8.0"
       Set cn = New ADODB.Connection
       cn.Open strCn
        
       'Add new values.
       Set rs = New ADODB.Recordset
       With rs
          .CursorLocation = adUseClient
          .Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic
          .AddNew
          .Fields("ColumnA").Value = 3
          .Fields("ColumnB").Value = 3
          .Fields("ColumnC").Value = ""
          .Fields("ColumnD").Value = 3
          .Fields("ColumnE").Value = 3
          .Fields("ColumnF").Value = "testing"
          .Update
          .Close
       End With
       Set rs = Nothing
       cn.Close
       Set cn = Nothing
    End Sub
    					
  7. 儲存在您的活頁簿 Test.xls 和相同的資料夾中的 Visual Basic 測試專案。
  8. 執行該專案,然後按一下 [[] 按鈕。在 Visual Basic 整合式開發環境 (IDE),執行專案的第一次可能會收到下列錯誤訊息:
    執行階段錯誤 '-2147467259 (80004005)': 選取 Collating 順序不受作業系統
    這是已知的問題。如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
    246167第一次對 Excel XLS 開啟 ADODB 資料錄集的定序順序時發生錯誤
  9. 錯誤訊息對話方塊方塊中按一下 [偵錯,然後按下 F5 鍵以繼續執行專案。請注意這插入兩個新的資料列的資料而不是只有一種,因為 更新 執行兩次。
  10. 關閉表單以結束專案。重新開啟 Excel,Test.xls,然後再檢查 Sheet1 中的資料]。您預期下列結果:

    摺疊此表格展開此表格
    ColumnAColumnBColumnCColumnDColumnEColumnF
    11測試11測試
    22測試22測試
    3333測試

    但是,您會看到下列資料:

    摺疊此表格展開此表格
    ColumnAColumnBColumnCColumnDColumnEColumnF
    11測試11測試
    22測試22測試
    3333測試

    它會顯示空字串,插入到 ColumnC 如是否已被忽略,然後已消失。因此,任何後續的數字值是其預定的目的地的左側插入一欄。後續的字串資料行並不會受到影響。

變化 1

設定測試資料,如下所示:

摺疊此表格展開此表格
ColumnAColumnBColumnCColumnDColumnE
1測試11測試
2測試22測試

在 Visual Basic] 專案中修改區段以新增新的值,如下所示:
   'Add new values.
   Set rs = New ADODB.Recordset
   With rs
      .CursorLocation = adUseClient
      .Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic
      .AddNew
      .Fields("ColumnA").Value = 3
      .Fields("ColumnB").Value = ""
      .Fields("ColumnC").Value = 3
      .Fields("ColumnD").Value = 3
      .Fields("ColumnE").Value = "testing"
      .Update
      .Close
   End With
   Set rs = Nothing
   cn.Close
   Set cn = Nothing
				
時 Excel 中開啟 Test.xls Sheet1 中會顯示下列資料:

摺疊此表格展開此表格
ColumnAColumnBColumnCColumnDColumnE
1測試11測試
2測試22測試
333測試

請注意當單一數字資料行之前空字串值沒有發生此問題。

變化 2

設定測試資料,如下所示:

摺疊此表格展開此表格
ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11測試測試11測試
22測試測試22測試

在 Visual Basic] 專案中修改區段以新增新的值,如下所示:
   'Add new values.
   Set rs = New ADODB.Recordset
   With rs
      .CursorLocation = adUseClient
      .Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic
      .AddNew
      .Fields("ColumnA").Value = 3
      .Fields("ColumnB").Value = 3
      .Fields("ColumnC").Value = ""
      .Fields("ColumnD").Value = ""
      .Fields("ColumnE").Value = 3
      .Fields("ColumnF").Value = 3
      .Fields("ColumnG").Value = "testing"
      .Update
      .Close
   End With
   Set rs = Nothing
   cn.Close
   Set cn = Nothing
				
時 Excel 中開啟 Test.xls Sheet1 中會顯示下列資料:

摺疊此表格展開此表格
ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11測試測試11測試
22測試測試22測試
3333測試

如果 ADO 插入兩個空字串值,它會顯示如同插入 ColumnC 和 ColumnD 的空字串會被忽略,且都已消失。因此,任何後續的數字值是其預定的目的地的左側插入兩個資料行。後續的字串資料行並不會受到影響。

?考

如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中 「 文件:
294410ACC2002: Null 值取代下一個欄位的資料,當您匯出至 Excel
257819HOWTO: 使用 ADO Visual Basic 或 VBA Excel 資料

屬性

文章編號: 314763 - 上次校閱: 2005年9月26日 - 版次: 1.2
這篇文章中的資訊適用於:
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft ActiveX Data Objects 2.6
  • Microsoft OLE DB Provider for Jet 4.0
關鍵字:?
kbmt kbhotfixserver kbqfe kbbug kbfix kbiisam kbjet kbqfe KB314763 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:314763
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com