2017-03-03 3 views
1

Dieser Code funktioniert ordnungsgemäß. Aber wenn ich den Bereich ändern möchte, gibt OleDBException.C# Excel-Abfrage Problem

OleDbCommand dates = new OleDbCommand("SELECT date FROM ["Sheet1$A1:B150"] ", baglanti); 
OleDbDataReader reader= dates.ExecuteReader(); 
while (reader.Read()) 
{ 
    list.Add(reader["date"]); 
} 

Bereich geändert Version:

OleDbCommand dates = new OleDbCommand("SELECT date FROM ["Sheet1$A250:B350"] ", baglanti); 
OleDbDataReader reader= dates.ExecuteReader(); 

while (reader.Read()) 
{ 
    list.Add(reader["date"]); 
} 

AUSNAHME IST:

System.Data.OleDb.OleDbException was unhandled by user code 
ErrorCode=-2147217904 
HResult=-2147217904 
Message=No value is entered for one or more required parameters. 
Source=Microsoft Access Database Engine 
StackTrace: 
konum: System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) 
konum: System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) 
konum: System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) 
konum: System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) 
konum: System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) 
konum: Hasta_Bulucu.Form1.bul_DoWork(Object sender, DoWorkEventArgs e) C:\Users\Furka\documents\visual studio 2015\Projects\Hasta Bulucu\Hasta  Bulucu\Form1.cs içinde: satır 269 
konum: System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e) 
konum: System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument) 
InnerException: 
+0

könnten Sie bitte die Verbindungszeichenfolge hinzufügen, die Sie verwenden, um OledDbConnection zu initialisieren? – andrews

+0

@andrews OleDbConnection baglanti = neue OleDbConnection (@ "Provider = Microsoft.ACE.OLEDB.12.0; Datenquelle =" + filePick.FileName.ToString() + "; Modus = Lesen; Erweiterte Eigenschaften = 'Excel 12.0 xml; HDR = JA; IMEX = 1; '"); –

+0

@andrews, wenn ich Bereich A1 zu R250 setze, enthält es Kopf des Blattes, aber A150 zu R300, das Kopfzeile nicht einschließt. Also SQL-Befehl kann Spaltennamen nicht finden. Ich muss Header-Informationen zu dieser Auswahl hinzufügen. So wie es geht? –

Antwort

1

das Versuchen folgende:

Set HDR=NO in der Verbindungszeichenfolge wie:

OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + 
         filePick.FileName.ToString() + 
";Mode=Read;Extended Properties='Excel 12.0 xml;HDR=NO;IMEX=1;'"); 

versuchen Sie auch, IMEX auf 0 und 2 einzustellen und versuchen Sie verschiedene Kombinationen mit HDR = NO.

Sie haben Recht, wenn der Bereich Spaltennamen nicht enthält, können Sie den Fehler erhalten. Daher müssen Sie versuchen, Datei für Spalte Indizes, nicht Namen zu lesen.

+0

Spalte Indizes Idee macht Sinn. Aber ich steckte in sql. Ich kann nicht nach SpalteID wie A, B, C ... abfragen. Ich versuchte SELECT A FROM [Sheet1 $], aber immer noch Ausnahme (HDR = NO) @andrews –

+0

@FK Ja, ich dachte darüber nach, war aber nicht in der Lage um irgendwelche Proben zu finden. Was ist, wenn Sie versuchen, die R1C1-Notation zu verwenden? Oder nur Spalten nach Index wie '[1]' abfragen. Auch 'SELECT *' und öffnen Sie die Ergebnismenge im Debugger und versuchen zu sehen, was Sie in Spalte/Feldnamen dort erhalten. – andrews

+0

@adrews endlich fertig. Es muss F1 sein ..... Fn nicht direkt Spaltenname wie A, B usw. Danke nochmals. –