你目前正处于脱机状态,正在等待 Internet 重新连接

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

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 314763
不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。
症状
如果在数据中包括含有空字符串值的字段使用了 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 = NothingEnd 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

警告:本文已自动翻译

属性

文章 ID:314763 - 上次审阅时间:09/26/2005 19:41:15 - 修订版本: 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
反馈
tml>