การแก้ไข: ADO แทรกข้อมูลลงในคอลัมน์ที่ไม่ถูกต้องใน Excel

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 314763
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

อาการ

เมื่อคุณใช้ ADO ในการแทรกแถวใหม่ของข้อมูลลงในแผ่นงาน Microsoft Excel ถ้าข้อมูลมีฟิลด์ที่ประกอบด้วยค่าสตริงว่าง ADO อาจใส่ค่าข้อมูลของเขตข้อมูลตัวเลขที่ตามมาลงในคอลัมน์ที่ไม่ถูกต้องใน Excel

ปัญหานี้เกิดขึ้นในทั้งผู้ Microsoft OLE DB ให้สำหรับเวอร์ชัน Jet 4.0 และโปรแกรมควบคุม ODBC ของ Microsoft สำหรับ Excel ปัญหานี้เกิดขึ้นไม่ว่า คุณใช้คำสั่งที่แทรก SQL หรือAddNewและการปรับปรุงวิธีการ ADOชุดระเบียนวัตถุ

ปัญหานี้ไม่เกิดขึ้นถ้าสมุดงาน Excel เปิดอยู่ในแอพลิเคชันของ Excel เมื่อ ADO แทรกเรกคอร์ดใหม่

อย่างไรก็ตาม Microsoft discourages ฝึกนี้ได้เนื่องจากหน่วยความจำรั่วเกิดขึ้นหาก Excel จะเปิดในระหว่างการดำเนินการ ADOสำหรับข้อมูลเพิ่มเติม โปรดคลิกหมายเลขบทความต่อไปนี้ เพื่อดูบทความในฐานความรู้ของ Microsoft::
319998BUG: หน่วยความจำรั่วเมื่อคุณแบบสอบถามเปิดแผ่นงาน Excel กับ ADO
โปรดดูส่วน "ข้อมูลเพิ่มเติม" สำหรับรายละเอียดเกี่ยวกับสถานการณ์เกิดปัญหานี้

การแก้ไข

เมื่อต้องการแก้ไขปัญหานี้ ขอรับ 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 สร้างโครงการ EXE มาตรฐานใหม่ Form1 จะถูกสร้างขึ้นตามค่าเริ่มต้น
  5. ในการProjectเมนู คลิกอ้างอิง:. จากรายการของข้อมูลอ้างอิงที่มีอยู่ เลือกวัตถุ Microsoft ActiveX ข้อมูล 2xไลบรารี.
  6. สถานCommandButtonควบคุมการ 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. บันทึกโครงการของคุณทดสอบ Visual Basic ในโฟลเดอร์เดียวกันเป็นสมุดงานของคุณ Test.xls
  8. เรียกใช้โครงการ และจากนั้น คลิกปุ่ม ในครั้งแรกที่คุณเรียกใช้โครงการในใน Visual Basic โครงพัฒนาสภาพแวดล้อม (IDE), คุณอาจได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:
    ข้อผิดพลาดรันไทม์ '-2147467259 (80004005)': collating ลำดับที่ไม่ได้รับการสนับสนุน โดยระบบปฏิบัติการที่เลือก
    นี่เป็นปัญหาที่ทราบอยู่แล้วสำหรับข้อมูลเพิ่มเติม โปรดคลิกหมายเลขบทความต่อไปนี้ เพื่อดูบทความในฐานความรู้ของ Microsoft::
    246167collating ข้อผิดพลาดลำดับ ADODB เปิดชุดระเบียนเวลาแรกกับ 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
				
เมื่อคุณเปิด Test.xls ใน Excel, Sheet1 แสดงข้อมูลต่อไปนี้:

ยุบตารางนี้ขยายตารางนี้
ColumnAColumnBColumnCColumnDColumnE
1การทดสอบ11การทดสอบ
2การทดสอบ22การทดสอบ
333การทดสอบ

สังเกตเห็นว่า ปัญหานี้ไม่เกิดขึ้นเมื่อคอลัมน์ที่เป็นตัวเลขเดียว precedes ค่าสตริงที่ว่างเปล่า

เปลี่ยนแปลงที่ 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
				
เมื่อคุณเปิด Test.xls ใน Excel, Sheet1 แสดงข้อมูลต่อไปนี้:

ยุบตารางนี้ขยายตารางนี้
ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11การทดสอบการทดสอบ11การทดสอบ
22การทดสอบการทดสอบ22การทดสอบ
3333การทดสอบ

ถ้า ADO แทรกค่าสตริงว่างสอง ปรากฏว่า สายอักขระว่างที่แทรกเข้าไปใน ColumnC และ ColumnD ถูกละเว้น และได้หายไป ดังนั้น ค่าตัวเลขตามมาถูกแทรกสองคอลัมน์ทางด้านซ้ายของปลายทางของพวกเขาต้อง คอลัมน์ของสายอักขระที่ตามมาคือไม่ได้รับผลกระทบ

ข้อมูลอ้างอิง

สำหรับข้อมูลเพิ่มเติม ให้คลิกหมายเลขบทความด้านล่างนี้ เพื่อดูบทความใน Microsoft Knowledge Base::
294410ACC2002: Nulls แทนที่ ด้วยข้อมูลของเขตข้อมูลถัดไปเมื่อคุณส่งออกไปยัง Excel
257819HOWTO: ใช้ ADO กับข้อมูล Excel จาก Visual Basic หรือ VBA

คุณสมบัติ

หมายเลขบทความ (Article ID): 314763 - รีวิวครั้งสุดท้าย: 13 มกราคม 2554 - Revision: 3.0
Keywords: 
kbhotfixserver kbqfe kbbug kbfix kbiisam kbjet kbmt KB314763 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:314763
การปฏิเสธความรับผิดชอบในเนื้อหาของ 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