FIX: ADO 插入数据在 Excel 中的错误列

文章翻译 文章翻译
文章编号: 314763 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

症状

如果在数据中包括含有空字符串值的字段使用了 Microsoft Excel 工作表中插入新的数据行的 ADO 时 ADO 可能会插入了错误的字段,在 Excel 中的后续数字字段的数据值。

在 Microsoft OLE DB 提供程序的 Jet 4.0 版和 Microsoft ODBC 驱动程序的 Excel 中,会出现此问题。之所以会出现此问题,您是否使用 SQL INSERT 语句或 AddNew 和 ADO 记录集 对象的 更新 方法。

如果 Excel 工作簿是在 Excel 应用程序中打开的 ADO 插入新记录时,不会发生此问题。

但是,Microsoft 不鼓励这种做法因为如果 Excel 在 ADO 操作过程中处于打开状态,则会出现内存泄漏。 有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
319998在查询用 ADO 打开 Excel 工作表时的错误: 内存泄漏
请参阅"更多信息"部分中,有关该情况下,会出现此问题的详细信息。

解决方案

若要解决此问题,获得最新的 service pack,对于 Jet 4.0 服务包。有关更多的信息请单击下面的文章编号,以查看 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 中,创建一个新的标准 EXE 项目。默认情况下创建 Form1。
  5. 项目 菜单上单击 引用。从可用引用列表中,选择 Microsoft ActiveX 数据对象 2 x
  6. 放置在 Form1,上的一个 命令按钮 控件,然后粘贴按钮 单击 事件过程中的下面的代码。注意此代码将为空字符串插入到中间的列列 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)": 选择排序序列不支持的操作系统
    这是一个已知的问题。有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
    246167排序顺序错误打开 ADODB Recordset Excel XLS 针对第一次
  9. 在错误消息对话框中单击 调试,然后按 F5 键以继续运行该项目。注意此插入的数据,而不是一个两个新行,因为 更新 运行两次。
  10. 关闭该窗体以结束项目。重新打开 Test.xls,在 Excel 中的,然后检查在 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
				
Sheet1 时在 Excel 中打开 Test.xls 显示以下数据:

收起该表格展开该表格
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
				
Sheet1 时在 Excel 中打开 Test.xls 显示以下数据:

收起该表格展开该表格
ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11测试测试11测试
22测试测试22测试
3333测试

如果 ADO 插入两个空字符串值,则它将显示像插入 ColumnC 和 ColumnD 的空字符串将被忽略,并消失了。因此,任何后续的数值是指其预期的目的地的左侧插入两个列。后续字符串列不会受到影响。

参考

有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
294410当您导出到 Excel 的下一个字段的数据替换 ACC2002: 空
257819HOWTO: 在 Visual Basic 或 VBA 的 Excel 数据中使用 ADO

属性

文章编号: 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
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 314763
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 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