Dieser schrittweise aufgebaute Artikel beschreibt das Abrufen von Tabellen- und Spaltennamen Metadaten aus Microsoft Excel-Datenquellen mithilfe der
GetOleDbSchemaTable -Methode mit dem Microsoft OLE DB Managed Provider und Microsoft OLE DB-Provider für Jet.
Die
GetOleDbSchemaTable -Methode, verfügbar gemacht wird, durch die
System.Data.OleDb -Klasse von Microsoft .NET Framework ist der Nachfolger .NET die
OpenSchema- Methode in früheren Versionen von Microsoft ActiveX Data Objects (ADO).
Beschreibung der Technik
Nachdem Sie mithilfe von ADO.NET eine Verbindung mit einer Excel-Datenquelle hergestellt, Sie eine Liste der Metadaten Tabelle mithilfe von
GetOleDbSchemaTable extrahieren und verwenden dieselbe Methode mit verschiedenen Argumenten um Spaltenmetadaten für die ausgewählte Tabelle zu erhalten. Sie können auch ein
DataGridTableStyle -Objekt verwenden, um Layout und die Abfrageergebnisse in einem Datenraster formatieren.
Voraussetzungen
In der folgenden Liste sind die empfohlene Hardware, Software, Netzwerkinfrastruktur und erforderlichen Service Packs aufgeführt:
- Visual Studio .NET auf einem kompatiblen Betriebssystem Microsoft Windows installiert
- Mindestens eine Microsoft Excel-Arbeitsmappe (.xls)-Datei mit einigen Zeilen und Spalten von Daten
In diesem Artikel werden vorausgesetzt mindestens grundlegende Kenntnisse in den folgenden Themen:
- Visual Basic .NET
- ADO.NET-Datenzugriff
- Excel-Arbeitsmappen und Arbeitsblätter
Beispiel
- Starten Sie Microsoft Visual Studio .NET aus, und erstellen Sie ein neues Visual Basic .NET Windows-Anwendungsprojekt.
- Fügen Sie drei Button -Steuerelemente und zwei DataGrid -Steuerelemente in das das Standardformular (Form1). Ändern Sie die Text -Eigenschaft des Button -Steuerelemente bzw. Abrufen von Metadaten , Format Tabellenübers und Format Spalten List .
- Wechseln Sie zur Code-Modul des Formulars, und fügen Sie die folgenden Imports -Anweisungen oben:
Imports System.Data
Imports System.Data.OleDb
Imports System.ComponentModel
- Legen Sie die folgenden Deklarationen auf Modulebene in der Form -Klasse nach der Zeile "Inherits System.Windows.Forms.Form". Passen Sie die Verbindungszeichenfolge wie erforderlich auf eine Excel-Arbeitsmappendatei, auf dem einige Zeilen und Spalten mit Daten enthält.
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 - Fügen Sie nach dem Bereich "Vom Windows Formulardesigner Generierter Code" folgenden Code in der Form -Klasse. Dieser Code ruft GetOleDbSchemaTable , die Tabelle und Spalten Listen zu laden, füllt die DataGrid -Steuerelementen und die Liste Spalten aktualisiert, wenn die ausgewählte Tabelle ändert.
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 - Fügen Sie den folgenden Code zum Layout und Formatieren von Tabellen, DataGrid mit Hilfe der TableStyles . Beachten Sie die Verwendung PropertyDescriptor zu erleichtern, vom Standard abweichende Formatierung des Date-Spalten.
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 - Fügen Sie folgenden Code zum gestalten und Formatieren der Spalten DataGrid mithilfe 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 - Führen Sie das Projekt aus.
- Klicken Sie auf Metadaten abrufen der Liste die Tabellen (DataGrid1) ausfüllen aller Spalten mit Informationen, die für jede Tabelle in der Excel-Arbeitsmappe von GetOleDbSchemaTable zurückgegeben werden. Liste (DataGrid2) wird gleichzeitig mit allen Spalten mit Informationen, die zurückgegeben werden für die Spalten in der ersten Tabelle in der Liste Tabellen gefüllt.
- Wählen Sie eine andere Tabelle in der Liste Tabellen . Die Änderungen der Spalten Liste um die Spalten aus der ausgewählten Tabelle aufgrund des Ereignishandlers Cm_PositionChanged anzuzeigen, die Sie implementiert.
- Klicken Sie auf Format Tabellenübers definieren und Anwenden einer TableMappingStyle zu DataGrid1. Dies macht die Spaltenheader mehr "angezeigten" und zeigt nur die vier Spalten nützliche Daten aus den neun Spalten, die vom GetOleDbSchemaTable zurückgegeben werden. Diese Spalten werden angezeigt:
TABLE_NAME
TABLE_TYPE
DATE_CREATED
DATE_MODIFIED
Diese leere Spalten werden nicht angezeigt: TABLE_CATALOG
TABLE_SCHEMA
TABLE_GUID
Beschreibung
TABLE_PROPID
- Klicken Sie auf Format Spalten List definieren und ein TableMappingStyle, DataGrid2 zu übernehmen. Dies macht die Spaltenheader mehr "angezeigten" und zeigt nur die 5 nützlichsten Spalten von Daten aus den 28 Spalten, die vom GetOleDbSchemaTable zurückgegeben werden.
COLUMN_NAME
ORDINAL_POSITION
DATA_TYPE
MAXIMUM_CHARACTER_LENGTH
NUMERIC_PRECISION
Diese größtenteils leeren Spalten werden nicht angezeigt: TABLE_CATALOG
TABLE_SCHEMA
Table_name (bereits bekannt)
COLUMN_GUID
COLUMN_PROPID
COLUMN_HASDEFAULT (immer false)
COLUMN_DEFAULT
COLUMN_FLAGS
IS_NULLABLE (immer true)
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
Domänenname
Beschreibung
- Klicken Sie auf eine andere Zeile in DataGrid1 eine andere Tabelle auswählen. Liste wird automatisch aktualisiert. TableStyles, die Sie zuvor jeder DataGrid zugewiesen bleiben wirksam.
Problembehandlung
- Die Spalte-Datentypen, die vom GetOleDbSchemaTable für eine Excel-Datenquelle zurückgegeben werden sind nicht mit den Datentypen, die von der OpenSchema -Methode im klassischen ADO zurückgegeben werden in allen Fällen identisch:
Tabelle minimierenTabelle vergrößern
| Spaltentyp | Klassische ADO | ADO.NET (OLE DB) |
|---|
| Numerische | 5 adDouble | 5 OleDbType.Double |
| Währung | 6 adCurrency | 6-OleDbType.Currency |
| Datum-Uhrzeit | 7 adDate | 7-OleDbType.Date |
| Wert | 11 adBoolean | 11-OleDbType.Boolean |
| Text < 255 | 202 adVarWChar | 130-OleDbType.WChar |
| Memo | 203 adLongVarWChar | 130-OleDbType.WChar |
- GetOleDbSchemaTable wie OpenSchema zurückgegeben eine einzelne Spalte "F1" aus ein leeres Excel-Arbeitsblatt, obwohl tatsächlich keine Daten oder Spaltenüberschriften vorhanden sind.
Weitere Informationen finden Sie die folgende KB-Artikelnummer:
257819
(http://support.microsoft.com/kb/257819/EN-US/
)
So wird 's gemacht: Verwenden von ADO mit Excel-Daten von Visual Basic oder VBA
Artikel-ID: 318373 - Geändert am: Mittwoch, 3. September 2003 - Version: 2.1
Die Informationen in diesem Artikel beziehen sich auf:
- Microsoft Visual Basic .NET 2003 Standard Edition
- Microsoft Visual Basic .NET 2002 Standard Edition
- Microsoft ADO.NET 1.1
- Microsoft ADO.NET 1.0
| kbmt kbhowtomaster kbprovider KB318373 KbMtde |
Maschinell übersetzter ArtikelWichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen:
318373
(http://support.microsoft.com/kb/318373/en-us/
)
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.