Laden...

Lesen per OleDb aus Excel-Datei: Parameter fehlt Wert.

Erstellt von ChrisHa vor 8 Jahren Letzter Beitrag vor 8 Jahren 4.571 Views
C
ChrisHa Themenstarter:in
12 Beiträge seit 2013
vor 8 Jahren
Lesen per OleDb aus Excel-Datei: Parameter fehlt Wert.

Hallo Gemeinde,

ich möchte gerne Werte aus einer Excel Datei auslesen und in ein DataGridView schreiben. Es sollen aber nur Werte genommen werden, die eine bestimmte Id besitzen.

Fehlermeldung:> Fehlermeldung:

Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben.

Meine Vermutung es liegt am Connection String:

string sConnectionString = "SELECT Vorname, Nachname FROM [Tabelle1$] WHERE Id='" + iIndex + "';";

Die Spalten _Vorname _und _Nachname _sind in der Excel Tabelle als Überschriften vorhanden. _Tabelle1 _ist meine einzige Tabelle in der Excel Datei.
_iIndex _wird vorher übergeben. iIndex ist als Bsp. der Wert 30.

Das Programm läuft mit Haltepunkt bis zum füllen des OleDB Adapters:

           
DataSet dsGeburtstage = new DataSet();
OleDbDataAdapter adapter = new OleDbDataAdapter(command);

adapter.Fill(dsGeburtstage); //Hier entsteht der Fehler

Meine Frage:
Was habe ich falsch gemacht bzw. einen Tipp wo mein Fehler liegen könnte. In einer bekannten Suchmaschine namens google habe ich nur gelesen, dass mein Connection String falsch sein könnte bzw. mir ein Verweis fehlt. Ich wüsste aber nicht, was falsch ist bzw. welchen Verweis ich denn für eine OleDB Verbindung brauche.

Vielen Dank für eure Hilfe und noch einen schönen Tag.

Lg

ChrisHa

S
93 Beiträge seit 2008
vor 8 Jahren

Also als erstes:

Das was Du als ConnectionString bezeichnest ist kein ConnectionString sondern dein CommandString.

Der ConnectionString ist ein String, der die Connection zur Datenbank öffnet.

Der CommandString den Du hier meinst, ist ein String der eine Anweisung an die Datenbank beinhaltet. Also Etwas was die Datenbank tun soll.

In Deinem Fall eine Select-Anweisung.

Google wird Dir hier bei der Suche nach ConnectionString natürlich etwas anderes bringen.

Deine Fehlermeldung bedeutet hier, daß ein Feld, das Du in dieser Select-Anweisung benutzt (hier Vorname, Nachname, Id) nicht in der Datenbank vorkommt.

C
ChrisHa Themenstarter:in
12 Beiträge seit 2013
vor 8 Jahren

Das was Du als ConnectionString bezeichnest ist kein ConnectionString sondern dein CommandString.

vielen dank dafür! Das ist schon mal richtig und klingt auch sehr logisch.

Deine Fehlermeldung bedeutet hier, daß ein Feld, das Du in dieser Select-Anweisung benutzt (hier Vorname, Nachname, Id) nicht in der Datenbank vorkommt.

Problem wurde dadurch beseitigt.

Erhalte nun eine neue Meldung:> Fehlermeldung:

Datentypenkonflikt in Kriterienausdruck.

Der Fehler erscheint wieder beim füllen des Akapters.

Hinweis von Coffeebean vor 8 Jahren

Bitte keine Full-Quotes und bitte benutze die richtigen Code-Tags
[Hinweis] Wie poste ich richtig? Punkt 2.3 und Punkt 6

S
93 Beiträge seit 2008
vor 8 Jahren

ich vermute da mal, daß Deine Id , die Du in der Select-Abfrage als String definiert hast in Deiner Exceltabelle als Zahl definiert ist.

D.h. Der Typ String und der Typ Zahl passen nicht zueinander.

Da reicht es auch schon, wenn in Excel auch nur eine Zeile falsch formatiert wurde, um diesen Fehler zu erzeugen:

Lösung: In diesem Fall die komplette ID-Spalte in Excel als String formatieren.

C
ChrisHa Themenstarter:in
12 Beiträge seit 2013
vor 8 Jahren

Danke für deinen Beitrag.

Habe in Excel alles nun auf Text gestellt bis auf das Datum natürlich.


string sConnectionString = "SELECT Id,Vorname,Name FROM [Tabelle1$] WHERE Datum='" + DateTime.Now.Year + "-" + DateTime.Now.Month + "-" + DateTime.Now.Day  + "';";

            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=xxx.xlsx" + @";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0""";

            OleDbCommand command = new OleDbCommand(sConnectionString, conn);

            DataSet dsGeburtstage = new DataSet();
            OleDbDataAdapter adapter = new OleDbDataAdapter(command);

            adapter.Fill(dsGeburtstage);

            dataGridView_Geburtstage_Heute.DataSource = dsGeburtstage.Tables[0];

**Fehlermeldung erhalten ich trotzdem weiterhin. **
Noch irgendeinen Tipp?

2.207 Beiträge seit 2011
vor 8 Jahren

Ich hab keine Ahnung von SQL-Querys ggn Excel, aber mal ins Blaue geschossen: Du machst deine Abfrage manuell und übergibst dein Date als String. Dein Format im Excel ist aber Date.

Versuch: Formatier mal das Datum im Excel genau so wie du es abfragst "year-month-day" und dann als string. Eine Zeile reicht ja.

Versuch 2: Übergib mal das DateTime-Objekt statt es auseinanderzunehmen. Und lass die Formatierung als Date im Excel.

Aber wie gesagt: Das würde ich jetzt probieren, ist echt nur geraten.

Dazu noch die InnerException anschauen und den Debugger verwenden.

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

C
ChrisHa Themenstarter:in
12 Beiträge seit 2013
vor 8 Jahren

Versuch: Formatier mal das Datum im Excel genau so wie du es abfragst "year-month-day" und dann als string. Eine Zeile reicht ja.

Versucht und gibt mir zumindest keinen Fehler mehr aus.

Versuch 2: Übergib mal das DateTime-Objekt statt es auseinanderzunehmen. Und lass die Formatierung als Date im Excel.

Auch versucht, aber das löst mein Problem nicht. Ich habe meinen Code nun etwas angepasst:

string sConnectionString = "SELECT Vorname,Name FROM [Tabelle1$] WHERE (Geburtstage)=" + DateTime.Now.Day + "-" + DateTime.Now.Month;

            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=xxx.xlsx" + @";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0""";
            
            try
            {
                OleDbCommand command = new OleDbCommand(sConnectionString, conn);

                DataSet dsGeburtstage = new DataSet();
                OleDbDataAdapter adapter = new OleDbDataAdapter(command);

                adapter.Fill(dsGeburtstage);
                dataGridView_Geburtstage_Heute.DataSource = dsGeburtstage.Tables[0];
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message);
                throw;
            }

In meiner Excel Tabelle habe ich sieht es wie folgt aus:
Name, Vorname jeweils Spalte
und die Geburtstage sind wie folgt formatiert: TT-MM

Geburtstage
15-04
30-09
07-12
21-10

Ich erhalte wie gesagt KEINE Fehlermeldung mehr, aber ich erhalte auch KEIN Ergebnis in meiner DataGridView

J
251 Beiträge seit 2012
vor 8 Jahren

Werden einstellige Ints nicht zu einstellige Strings? z.B. 1 = "1" != "01" etc.

C
ChrisHa Themenstarter:in
12 Beiträge seit 2013
vor 8 Jahren

Werden einstellige Ints nicht zu einstellige Strings? z.B. 1 = "1" != "01" etc.

Das kann durch aus sein, aber:
Wir haben den Monat Oktober und auch wenn ich:

string sCommandString = "SELECT Vorname,Name FROM [Tabelle1$] WHERE (Geburtstage)=21-10";

dann geht es leider auch nicht.

502 Beiträge seit 2004
vor 8 Jahren

Also wenn Du in Excel wirklich als Datum formatiert hast, dann solltest Du das auch als Datum ansprechen - und zwar richtig (sprich: so wie es sich gehört...):

OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Mappe1.xlsx" + @";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0""";


            string sql = "SELECT Text,Datum FROM [Tabelle1$] WHERE Datum=@MyDateParameter;";            
            OleDbCommand command = new OleDbCommand(sql, conn);
            command.Parameters.AddWithValue("@MyDateParameter", DateTime.Today);
...

Bart Simpson


Edit: Noch so als kleiner Hinweis: Der Excel-OLE-DB-Provider ist sehr zickig, was die "Typenreinheit" innerhalb der einzelnen Spalten angeht...

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

C
ChrisHa Themenstarter:in
12 Beiträge seit 2013
vor 8 Jahren

Danke Bart.
Leider hilft das auch nichts. Da der Tag "heute" in meinem Fall falsch wäre. Ich benötige nur den Monat und den Tag, da es eine Art: Wer hat heute Geburtstag werden soll.

Trotzdem danke an alle die bis jetzt geantwortet haben.
Für weitere Tipps bin ich gerne offen.

Habe es jetzt so versucht:

string sCommandString = "SELECT Vorname,Name FROM [Tabelle1$] WHERE Geburtstage=@MyDateParameter";
            
            try
            {
                OleDbCommand command = new OleDbCommand(sCommandString, conn);
                command.Parameters.AddWithValue("@MyDateParameter", DateTime.Now.Day + "-" + DateTime.Now.Month);
502 Beiträge seit 2004
vor 8 Jahren

Hallo,

also mal abgesehen davon, dass ich die Anforderung hier

Leider hilft das auch nichts. Da der Tag "heute" in meinem Fall falsch wäre. Ich benötige nur den Monat und den Tag, da es eine Art: Wer hat heute Geburtstag werden soll.

nicht wirklich aus Deinen bisherigen Beschreibungen herausgelesen habe, hilft Dir das sehr wohl - allerdings sollte man sich halt ein wenig mit den Grundlagen von SQL beschäftgen...

SELECT Text,Datum FROM [Tabelle1$] WHERE month(Datum)=month(@MyDateParameter) and day(Datum)=day(@MyDateParameter);

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

C
ChrisHa Themenstarter:in
12 Beiträge seit 2013
vor 8 Jahren

Passt soweit. Es geht doch so wie ich es gemacht habe und du es vorher erklärt hast. Danke dir.
Hatte nur einen kleinen Dreher beim Tippen noch.

Hier meine Endlösung:

string sCommandString = "SELECT Vorname,Name FROM [Tabelle1$] WHERE Geburtstage=@MyDateParameter";

            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=xxx" + @";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0""";
            
            try
            {
                OleDbCommand command = new OleDbCommand(sCommandString, conn);
                command.Parameters.AddWithValue("@MyDateParameter", DateTime.Now.Day + "." + DateTime.Now.Month);

                DataSet dsGeburtstage = new DataSet();
                OleDbDataAdapter adapter = new OleDbDataAdapter(command);

                adapter.Fill(dsGeburtstage);
                dataGridView_Geburtstage_Heute.DataSource = dsGeburtstage.Tables[0];
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message);
                throw;
            }

502 Beiträge seit 2004
vor 8 Jahren
command.Parameters.AddWithValue("@MyDateParameter", DateTime.Now.Day + "." + DateTime.Now.Month);  
  

...also dazu fällt mir jetzt eigentlich nur noch eines ein: AUTSCH. :evil:

Ich hab's nicht ausprobiert und es mag durchaus sein, dass Excel diese Notation akzeptiert - aber warum verwendest Du hier so ein -mit Verlaub- String-Gefrickel, wenn es mit den Datumsfunktionen doch genau das gibt, was Du brauchst um es vernünftig zu lösen?
Spätestens wenn Du mal mit Sprachübergreifenden Daten zu tun hast (z.B. deutsches vs. englisches Datumsformat) sind die Probleme bei Deiner Lösung vorprogrammiert...

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

J
251 Beiträge seit 2012
vor 8 Jahren

Vllt ist es kein richtiges Datumsfeld in Excel? ^^