2010-12-01 22 views
2

ich eine Excel-Datei in dieser Form erhalten haben:Quirky SELECT aus Excel-Datei über OleDbDataAdapter-Methode (C#)

Column 1 Column 2 Column 3 
data1  data2  
data1  data2 
data1  data2 
data1  data2 
data1  data2  data3 

Das heißt, die ganze Spalte 3 ist leer, bis auf die letzte Zeile. Ich greife auf die Excel-Datei über OleDbDataAdapter, eine DataTable zurück: Hier ist der Code.

query = "SELECT * FROM [" + query + "]"; 
objDT = new DataTable(); 
objCmdSQL = this.GetCommand(); 
objCmdSQL.CommandText = query; 
objSQLDad = new OleDbDataAdapter(objCmdSQL); 
objSQLDad.Fill(objDT); 
return objDT; 

Der Punkt ist in diesem Szenario eine Datatable meines Code mit nur Spalte gibt 1 und Spalte 2.
Meine Vermutung ist, dass Jetmodul Spaltentyp vom Typ der ersten Zelle in jedem abzuleiten versucht Säule; Da der erste Wert null ist, wird die gesamte Spalte ignoriert.
Ich habe versucht, Nullen zu füllen, und dieser Code gibt tatsächlich alle drei Spalten zurück; Dies ist offensichtlich die am wenigsten bevorzugte Lösung, da ich eine große Anzahl von kleinen Dateien verarbeiten muss.
Das Umkehren des Auswahlbereichs (von "A1: C5" bis "C5: A1") funktioniert ebenfalls nicht. Ich suche etwas eleganteres.
Ich habe bereits ein paar Beiträge gefunden, die sich mit Typ-Mismatch beschäftigen (Varchar-Zellen in int-Spalten und umgekehrt), aber tatsächlich nichts gefunden haben, was mit diesem zusammenhängt.
Danke fürs Lesen!

bearbeiten

seltsame Verhalten wieder. Ich muss hauptsächlich an Excel 2003 .xls-Dateien arbeiten, aber da diese Frage beantwortet wurde, dachte ich, ich könnte meinen Code gegen Excel 2007 .xslx-Dateien testen. Die Verbindungszeichenfolge ist folgende:

string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _fileName.Trim() + @";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;"""; 

ich die Ausnahme „Externe Tabelle nicht im erwarteten Format ist“, die ich denke, die Standard-Ausnahme ist, wenn ein Konflikt Version ist zwischen ACE/JET und die Datei wird geöffnet.

Der String

Provider=Microsoft.ACE.OLEDB.12.0 

bedeutet, dass ich die neueste Version von OLEDB verwenden, habe ich einen kurzen Blick um und diese Version verwendet wird überall dort Notwendigkeit, .xlsx-Dateien zu verbinden ist.
Ich habe versucht mit nur einem Vanille-Anbieter (nur Excel 12.0, ohne IMEX oder HDR), aber ich bekomme die gleiche Ausnahme.
Ich bin auf .NET 2.0.50727 SP2, vielleicht Zeit für ein Upgrade?

+0

Also gibt es keine Header auf den Spalten in Excel? Und hast du den IMEX-Switch an der Verbindung ausprobiert? – Sorax

+0

Es gibt Header, aber ich wähle den Teil der Tabelle aus, der nur die Daten enthält, die horizontale und vertikale Header vermeiden. – SimoneF

Antwort

7

Ich habe Ihre Situation neu erstellt und folgende 3 Spalten korrekt zurückgegeben. Das heißt, die ersten beiden Spalten wurden vollständig mit Daten gefüllt, und die dritte enthielt null bis zur letzten Zeile, die Daten enthielt.

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"; 
DataTable dt = new DataTable(); 
OleDbConnection conn = new OleDbConnection(connString); 
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn); 

adapter.Fill(dt); 

Hinweis verwendete ich den Access Database Engine(ACE) Provider, der den alten Joint Engine Technology(JET) Anbieter erfolgreich war, und meine Ergebnisse ein Verhalten Unterschied zwischen den beiden darstellen. Natürlich, wenn Sie es nicht bereits verwenden, schlage ich vor, den ACE Anbieter zu verwenden, wie ich glaube, Microsoft würde auch. Beachten Sie auch die Extended Properties:

"HDR = Ja;" gibt an, dass die erste Zeile Spaltennamen und keine Daten enthält. "HDR = Nein;" zeigt das Gegenteil an.

"IMEX = 1;" sagt dem Fahrer immer gelesen "gemischt" (Zahlen, Daten, Zeichenfolgen usw.) Datenspalten als Text. Beachten Sie, dass sich diese Option auf Excel-Blatt-Schreibzugriff negativ auswirken kann.

Lassen Sie mich wissen, ob dies hilft.

+1

IMEX = 1 ist nur nützlich bis zum Registrierungseintrag für TypeGuessRows, normalerweise 6, denke ich (0 = alle Zeilen) – Fionnuala

+0

Es funktioniert! Die Methode ist nun in der Lage, ein DataSet mit allen drei Spalten zurückzugeben und NULL-Werte dort einzugeben, wo keine Daten vorhanden sind. Danke für die Einsicht, Sorax. – SimoneF

+0

Ich bin froh, dass ich geholfen habe. – Sorax