บทความที่มีการทีละขั้นตอนนี้อธิบายถึงวิธีการที่ดึงข้อมูลเมตาของตารางและคอลัมน์จากแหล่งข้อมูลของ Microsoft Excel โดยใช้การ
GetOleDbSchemaTableวิธีกับผู้ที่ Microsoft OLE DB ที่จัดการให้และผู้ที่ Microsoft OLE DB ให้สำหรับ Jet
กระบวนการ
GetOleDbSchemaTableวิธีการที่เปิดเผยโดย
System.Data.OleDbคลาสของ Microsoft .NET Framework จะทำต่อ.NET ไป
OpenSchemaวิธีการในเวอร์ชันก่อนหน้าของออปเจ็กต์ข้อมูล ActiveX ของ Microsoft (ADO)
คำอธิบายเกี่ยวกับเทคนิค
หลังจากที่คุณเชื่อมต่อกับแหล่งข้อมูล Excel โดยใช้ ADO.NET คุณแยกรายการของข้อมูลเมตาของตาราง โดยใช้
GetOleDbSchemaTableจากนั้น ใช้วิธีการเดียวกันกับอาร์กิวเมนต์ที่แตกต่างกันเพื่อขอรับข้อมูลเมตาของคอลัมน์สำหรับตารางที่เลือก คุณยังสามารถใช้เป็น
DataGridTableStyleวัตถุการจัดเค้าโครง และการจัดรูปแบบแบบสอบถามของคุณส่งผลในเส้นตารางข้อมูล
ความต้องการ
รายการต่อไปนี้แสดงฮาร์ดแวร์ที่แนะนำ ซอฟต์แวร์ โครงสร้างพื้นฐานของเครือข่าย และ service pack ที่คุณต้องการ:
- Studio .NET ที่แสดงผลที่ติดตั้งอยู่บนระบบปฏิบัติการ Microsoft Windows เข้ากันได้
- แฟ้มสมุดงาน (.xls) Microsoft Excel อย่างน้อยหนึ่งแถวและคอลัมน์ของข้อมูล
บทความนี้อนุมานว่า คุณมี familiarity น้อยพื้นฐานกับหัวข้อต่อไปนี้:
- visual Basic .NET
- การเข้าถึงข้อมูล ADO.NET
- สมุดงาน Excel และแผ่นงาน
ตัวอย่าง
- เริ่มการทำงานของ Microsoft Visual Studio .NET และสร้างโครงการใหม่ของแอพลิเคชัน Windows .NET Visual Basic
- เพิ่ม 3ปุ่มตัวควบคุมและสองDataGridตัวควบคุมฟอร์มเริ่มต้น (Form1) การเปลี่ยนแปลงนั้นข้อความคุณสมบัตินี้ปุ่มควบคุมการดึงข้อมูลเมตา,รายการตารางรูปแบบและรูปแบบคอลัมน์รายการตามลำดับ
- สลับไปยังโมดูรหัสของฟอร์ม และเพิ่มต่อไปนี้นำเข้าคำชี้แจงด้านบน:
Imports System.Data
Imports System.Data.OleDb
Imports System.ComponentModel
- แทรก declarations ระดับโมดูลต่อไปนี้ในการแบบฟอร์มคลาหลังจากบรรทัด "System.Windows.Forms.Form ที่สืบทอด" การปรับปรุงสตริงการเชื่อมต่อตามความจำเป็นให้ชี้ไปที่แฟ้มสมุดงาน Excel ที่ประกอบด้วยแถวและคอลัมน์ของข้อมูลบางอย่าง
Dim cn As OleDbConnection
Dim strCn As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\test.xls;Extended Properties=Excel 8.0"
Dim dtTables As DataTable
Dim WithEvents cm As CurrencyManager
Dim dtColumns As DataTable
Dim dvColumns As DataView - แทรกรหัสต่อไปนี้ในการแบบฟอร์มคลาหลังจากพื้นที่ "การออกแบบฟอร์ม Windows สร้างรหัส"
รหัสนี้เรียกGetOleDbSchemaTableโหลดรายการตารางและคอลัมน์ populatesDataGridควบคุม และการปรับปรุงรายการคอลัมน์เมื่อเปลี่ยนแปลงตารางที่เลือก
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Call GetTablesList()
End Sub
Private Sub GetTablesList()
cn = New OleDbConnection(strCn)
cn.Open()
dtTables = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
DataGrid1.DataSource = dtTables
DataGrid1.ReadOnly = True
cn.Close()
Call GetColumnsList()
End Sub
Private Sub GetColumnsList()
If cm Is Nothing Then
cm = CType(Me.BindingContext(dtTables), CurrencyManager)
End If
Dim r As Integer = cm.Position
Dim strTable As String = dtTables.Rows(r)("TABLE_NAME")
cn = New OleDbConnection(strCn)
cn.Open()
dtColumns = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, _
New Object() {Nothing, Nothing, strTable, Nothing})
dvColumns = New DataView(dtColumns)
dvColumns.Sort = "ORDINAL_POSITION"
DataGrid2.DataSource = dvColumns
DataGrid2.ReadOnly = True
cn.Close()
End Sub
Private Sub cm_PositionChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles cm.PositionChanged
Call GetColumnsList()
End Sub - แทรกรหัสต่อไปนี้เพื่อจัดเค้าโครง และการจัดรูปแบบตารางDataGridโดยการใช้TableStyles. หมายเหตุการใช้PropertyDescriptorเพื่อให้ง่ายต่อการไม่ใช่ค่าเริ่มต้นการจัดรูปแบบของคอลัมน์วัน
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
Call FormatTablesGrid(dtTables)
End Sub
Private Sub FormatTablesGrid(ByVal dt2format As DataTable)
Dim gs As DataGridTableStyle = New DataGridTableStyle()
gs.MappingName = dt2format.TableName
Dim cs As DataGridColumnStyle = New DataGridTextBoxColumn()
With cs
.MappingName = "TABLE_NAME"
.HeaderText = "Table Name"
.Width = 75
End With
gs.GridColumnStyles.Add(cs)
cs = New DataGridTextBoxColumn()
With cs
.MappingName = "TABLE_TYPE"
.HeaderText = "Table Type"
.Width = 75
End With
gs.GridColumnStyles.Add(cs)
Dim cm As CurrencyManager = CType(Me.BindingContext(dt2format), CurrencyManager)
Dim pd As PropertyDescriptor = cm.GetItemProperties()("DATE_CREATED")
cs = New DataGridTextBoxColumn(pd, "d")
With cs
.MappingName = "DATE_CREATED"
.HeaderText = "Date Created"
.Width = 75
End With
gs.GridColumnStyles.Add(cs)
cm = CType(Me.BindingContext(dt2format), CurrencyManager)
pd = cm.GetItemProperties()("DATE_MODIFIED")
cs = New DataGridTextBoxColumn(pd, "d")
With cs
.MappingName = "DATE_MODIFIED"
.HeaderText = "Date Modified"
.Width = 75
End With
gs.GridColumnStyles.Add(cs)
DataGrid1.TableStyles.Add(gs)
Me.Button2.Enabled = False
End Sub - แทรกรหัสต่อไปนี้เพื่อจัดเค้าโครง และการจัดรูปแบบคอลัมน์การDataGridโดยการใช้TableStyle:
Private Sub Button3_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button3.Click
Call FormatColumnsGrid(dtColumns)
End Sub
Private Sub FormatColumnsGrid(ByVal dt2format As DataTable)
Dim gs As DataGridTableStyle = New DataGridTableStyle()
gs.MappingName = dtColumns.TableName
Dim cs As DataGridColumnStyle = New DataGridTextBoxColumn()
With cs
.MappingName = "COLUMN_NAME"
.HeaderText = "Column Name"
.Width = 100
End With
gs.GridColumnStyles.Add(cs)
cs = New DataGridTextBoxColumn()
With cs
.MappingName = "ORDINAL_POSITION"
.HeaderText = "Ordinal Position"
.Width = 100
End With
gs.GridColumnStyles.Add(cs)
cs = New DataGridTextBoxColumn()
With cs
.MappingName = "DATA_TYPE"
.HeaderText = "Data Type"
.Width = 75
End With
gs.GridColumnStyles.Add(cs)
cs = New DataGridTextBoxColumn()
With cs
.MappingName = "CHARACTER_MAXIMUM_LENGTH"
.HeaderText = "Text Length"
.Width = 75
End With
gs.GridColumnStyles.Add(cs)
cs = New DataGridTextBoxColumn()
With cs
.MappingName = "NUMERIC_PRECISION"
.HeaderText = "Numeric Precision"
.Width = 75
End With
gs.GridColumnStyles.Add(cs)
DataGrid2.TableStyles.Add(gs)
Me.Button3.Enabled = False
End Sub - เรียกใช้โครงการ
- คลิกดึงข้อมูลเมตาเมื่อต้องการกรอกข้อมูลตารางรายการ (DataGrid1) กับคอลัมน์ของข้อมูลที่ส่งคืนสำหรับแต่ละตารางในสมุดงาน Excel โดย ทั้งหมดGetOleDbSchemaTable. กระบวนการคอลัมน์กรอกข้อมูลในเวลาเดียวกับคอลัมน์ของข้อมูลที่จะส่งกลับทั้งหมดสำหรับคอลัมน์ในตารางแรกในรายการ (DataGrid2)ตารางรายการ
- เลือกตารางอื่นในการตารางรายการ กระบวนการคอลัมน์การเปลี่ยนแปลงการแสดงคอลัมน์จากตารางที่เลือกได้เนื่องจากการแสดงรายการนี้cm_PositionChangedตัวจัดการเหตุการณ์ที่คุณมีการใช้งาน
- คลิกรายการตารางรูปแบบเมื่อต้องการกำหนดค่า และใช้แบบ TableMappingStyle DataGrid1 ซึ่งทำให้เป็นมาก "มิตร" ส่วนหัวของคอลัมน์ และแสดงเฉพาะคอลัมน์ที่สี่ของข้อมูลที่เป็นประโยชน์จากคอลัมน์ nine ที่ส่งกลับโดยGetOleDbSchemaTable. แสดงคอลัมน์เหล่านี้:
table_name
table_type
date_created
date_modified
คอลัมน์ช่องว่างเหล่านี้ไม่ได้แสดง:table_catalog
table_schema
table_guid
คำอธิบาย:
table_propid
- คลิกรูปแบบคอลัมน์รายการเมื่อต้อง การกำหนด และ การใช้เป็น TableMappingStyle DataGrid2 ซึ่งทำให้เป็นมาก "มิตร" ส่วนหัวของคอลัมน์ และแสดงเฉพาะ 5 ประโยชน์คอลัมน์ของข้อมูลจากคอลัมน์ที่ 28 ที่ส่งคืนโดยGetOleDbSchemaTable.
column_name
ordinal_position
data_type
maximum_character_length
numeric_precision
คอลัมน์ที่ว่างเปล่า mostly เหล่านี้ไม่ได้แสดง:table_catalog
table_schema
TABLE_NAME (ทราบอยู่แล้ว)
column_guid
column_propid
COLUMN_HASDEFAULT (เท็จเสมอ)
column_default
column_flags
IS_NULLABLE (จริงเสมอ)
type_guid
character_octet_length
numeric_scale
datetime_precision
character_set_catalog
character_set_schema
character_set_name
collation_catalog
collation_schema
collation_name
domain_catalog
domain_schema
ชื่อโดเมน
คำอธิบาย:
- คลิกแถวที่แตกต่างกันใน DataGrid1 เพื่อเลือกตารางอื่น กระบวนการคอลัมน์รายการถูกปรับปรุงโดยอัตโนมัติ TableStyles ที่คุณประยุกต์ใช้กับแต่ละก่อนหน้านี้DataGridยังคงมีผล
การแก้ไขปัญหา
- ชนิดของข้อมูลคอลัมน์ที่ถูกส่งกลับโดยGetOleDbSchemaTableสำหรับ Excel มี แหล่งข้อมูลจะไม่เหมือนกันในกรณีที่ทั้งหมดกับชนิดของข้อมูลที่ส่งกลับโดยOpenSchemaวิธีการในคลาสสิ ADO:
ยุบตารางนี้ขยายตารางนี้
| ชนิดคอลัมน์ | ADO คลาสสิก | ado.net (ole db) |
|---|
| ตัวเลข | 5 adDouble | 5 OleDbType.Double |
| สกุลเงิน | 6 adCurrency | 6 OleDbType.Currency |
| วันที่/เวลา | 7 adDate | 7 OleDbType.Date |
| Boolean | 11 adBoolean | 11 OleDbType.Boolean |
| ข้อความ<> | 202 ด้วย adVarWChar | 130 OleDbType.WChar |
| บันทึก | 203 adLongVarWChar | 130 OleDbType.WChar |
- GetOleDbSchemaTableเหมือนกับOpenSchemaส่งกลับค่าคอลัมน์เดียว "F1" จากแผ่นว่างงาน Excel ถึงแม้ว่าใน fact มีที่อยู่ของส่วนหัวไม่มีข้อมูลหรือคอลัมน์
สำหรับข้อมูลเพิ่มเติม ให้คลิกหมายเลขบทความต่อไปนี้ เพื่อดูบทความในฐานความรู้ของ Microsoft::
257819
(http://support.microsoft.com/kb/257819/EN-US/
)
HOWTO: ใช้ ADO กับข้อมูล Excel จาก Visual Basic หรือ VBA
หมายเลขบทความ (Article ID): 318373 - รีวิวครั้งสุดท้าย: 13 มกราคม 2554 - Revision: 4.0
ใช้กับ
- Microsoft Visual Basic .NET 2003 Standard Edition
- Microsoft Visual Basic .NET 2002 Standard Edition
- Microsoft ADO.NET 1.1
| kbhowtomaster kbprovider kbmt KB318373 KbMtth |
แปลโดยคอมพิวเตอร์ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:
318373
(http://support.microsoft.com/kb/318373/en-us/
)