Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Lesen per OleDb aus Excel-Datei: Parameter fehlt Wert.
ChrisHa
myCSharp.de - Member



Dabei seit:
Beiträge: 12

Themenstarter:

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

beantworten | zitieren | melden

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:
Fehler
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ChrisHa am .
private Nachricht | Beiträge des Benutzers
san-software
myCSharp.de - Member



Dabei seit:
Beiträge: 96

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von san-software am .
private Nachricht | Beiträge des Benutzers
ChrisHa
myCSharp.de - Member



Dabei seit:
Beiträge: 12

Themenstarter:

beantworten | zitieren | melden

Zitat
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.
Zitat
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:
Fehler
Datentypenkonflikt in Kriterienausdruck.

Der Fehler erscheint wieder beim füllen des Akapters.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ChrisHa am .

Moderationshinweis von Coffeebean (21.10.2015 - 11:03:51):

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

private Nachricht | Beiträge des Benutzers
san-software
myCSharp.de - Member



Dabei seit:
Beiträge: 96

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
ChrisHa
myCSharp.de - Member



Dabei seit:
Beiträge: 12

Themenstarter:

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ChrisHa am .
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2461
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
ChrisHa
myCSharp.de - Member



Dabei seit:
Beiträge: 12

Themenstarter:

beantworten | zitieren | melden

Zitat
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.
Zitat
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ChrisHa am .
private Nachricht | Beiträge des Benutzers
Jamikus
myCSharp.de - Member



Dabei seit:
Beiträge: 251
Herkunft: Oberhausen (NRW)

beantworten | zitieren | melden

Werden einstellige Ints nicht zu einstellige Strings? z.B. 1 = "1" != "01" etc.
private Nachricht | Beiträge des Benutzers
ChrisHa
myCSharp.de - Member



Dabei seit:
Beiträge: 12

Themenstarter:

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers
Mr. Bart Simpson
myCSharp.de - Member

Avatar #avatar-3273.gif


Dabei seit:
Beiträge: 502
Herkunft: Mittelfranken

beantworten | zitieren | melden

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 [email protected];";            
            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...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Mr. Bart Simpson am .
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...
private Nachricht | Beiträge des Benutzers
ChrisHa
myCSharp.de - Member



Dabei seit:
Beiträge: 12

Themenstarter:

beantworten | zitieren | melden

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 [email protected]";
            
            try
            {
                OleDbCommand command = new OleDbCommand(sCommandString, conn);
                command.Parameters.AddWithValue("@MyDateParameter", DateTime.Now.Day + "-" + DateTime.Now.Month);
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ChrisHa am .
private Nachricht | Beiträge des Benutzers
Mr. Bart Simpson
myCSharp.de - Member

Avatar #avatar-3273.gif


Dabei seit:
Beiträge: 502
Herkunft: Mittelfranken

beantworten | zitieren | melden

Hallo,

also mal abgesehen davon, dass ich die Anforderung hier
Zitat von ChrisHa
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...
private Nachricht | Beiträge des Benutzers
ChrisHa
myCSharp.de - Member



Dabei seit:
Beiträge: 12

Themenstarter:

beantworten | zitieren | melden

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 [email protected]";

            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;
            }
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ChrisHa am .
private Nachricht | Beiträge des Benutzers
Mr. Bart Simpson
myCSharp.de - Member

Avatar #avatar-3273.gif


Dabei seit:
Beiträge: 502
Herkunft: Mittelfranken

beantworten | zitieren | melden

Zitat von ChrisHa

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...
private Nachricht | Beiträge des Benutzers
Jamikus
myCSharp.de - Member



Dabei seit:
Beiträge: 251
Herkunft: Oberhausen (NRW)

beantworten | zitieren | melden

Vllt ist es kein richtiges Datumsfeld in Excel? ^^
private Nachricht | Beiträge des Benutzers