verwendetes Datenbanksystem: MS-Access
Schönen Tag werte Kollegen!
Ich verzweifle langsam an einem eigentlich so leichtem Stück Programmcode, und hoffe ihr könnt mich darauf hinweisen, was ich zu übersehen scheine! Ich poste es mal:
com.CommandText = "SELECT strForename, strName FROM members WHERE intNumber =" +comboBox2.SelectedItem.ToString();
if (ds.Tables["Name"] != null)
{
ds.Tables["Name"].Clear();
}
ds.Clear();
da.Fill(ds, "Name");
dataGridView1.DataSource = ds.Tables["Name"];
Soll nichts weiter tun als aus einer Access-Datenbank (über Oledb-Objekt) den dgv zu befüllen. Das Programm lässt sich ausführen, es stürtzt bei den betreffenden Zeilen nichteinmal ab, der dgv bleibt lediglich leer auch wenn er die richtigen Spaltennamen bereits anzeigt. Wieso?
Danke schonmal im voraus,
Lg Arco
weil deine selectabfrage flasch ist. um genau zu sein die wherebedingung. versuche es mal mit "Like" anstatt dem "="
außerdem kann ich dir nur das da ans herz legen: [Artikelserie] Parameter von SQL Befehlen
Mit Like stürzt er ab bei der Befehlszeile, außerdem funktionieren andere SQL-Befehle bereits mit der Formulierung WHERE intNumber = " +....
Den Link werde ich mir mal ansehen, ansonsten bleibt meine Frage bestehen!
Danke für die Mühe!
sieht für mich auch nach falscher query aus. unbedingt parameter benutzen. erleichtern wirklich das leben.
heute code ich, morgen debug ich und übermorgen cast ich die königin auf int
Hallo,
was liefert denn SelectedItem? Passt vielleicht SelectedIndex besser oder sogar SelectedText?
Unabhängig davon sind wirklich SQL-Parameter dringendst zu empfehlen! Jürgen
@juetho
die comboBox2 ist gefüllt mit zahlen. (genauer gesagt mit startnummern, und ich möchte einfach zu der ausgewählten startnummer den vor- und nachnamen haben (strForename, strName))
Hab bereits überprüft ob er den richtigen Wert aus der combobox bekommt, indem ichs in eine String Variable zwischengespeichert hab und in einer textBox ausgeben hab lassen, das passt!
ich hab bereits versucht das ausgelesene aus der CB in int32 zu convertieren, lässt er mich aber nicht. ich werde selectedtext und selectedindex mal ausprobieren
@jackolena:
nachdem du mir gesagt hast das "=" mit "like" zu ersetzen, sah das dann so aus:
com.CommandText = "SELECT strForename, strName FROM members WHERE intNumber LIKE " +comboBox2.SelectedItem.ToString();
ja, das habe ich mir gedacht. strings müssen in in sql in ' eingeschlossen sein, wenn du sie verwenden willst.
Jack wollte eigentlich noch so etwas hinzufügen:
Aber auch damit das nicht beachtet werden muss, sind Parameter vorzuziehen.
Jürgen
Interessant! obacht:
bisher war der betreffende Codeabschnitt in der Combobox2SelectedIndexChanged Methode.
ich habe ihn jetzt probeweise in einen Button1_click Methode hineingeschrieben, so dass ich praktisch zuerst die zahl in der combobox aussuche, den button drücke, und er dann sucht.
Das funktioniert! mit dem selben code, 1 zu 1 copy-paste (nur mit con.open und con.close zusätzlich)
wie kann das sein?
andere frage, wie kommst du auf die Idee, es würde nicht funktionieren?
Die Infos holst du dir ja von der selben stelle, der einzige Unterschied ist eben das "Wann" du dir die Daten holst. (nicht beim wechseln, sondern eben bei einem Klick auf den Button)
lg Lion
wie ich auf die idee komme das es nicht funktioniert?
er tut es nicht! ^^ das dataGridView bleibt leer, solange der Code im Combobox2IndexChanged Objekt steht! ^^
Was nun?
Das funktioniert! mit dem selben code, 1 zu 1 copy-paste (nur mit con.open und con.close zusätzlich)
er tut es nicht! ^^ das dataGridView bleibt leer, solange der Code im Combobox2IndexChanged Objekt steht! ^^
Dann sorry für meine "blöde" Frage, aber für mich sind das zwei gegensprüche 😃
Dann debugge doch mal die Stelle an und guck dir an, wie dein Select Statement am ende aussieht bzw. was dein SelectedItem aussieht.
lg Lion
^^ du hast völlig recht, es ist ein widerspruch!
*seufz* soweit wollte ich euch da gar nicht mit rein ziehen! wir haben probleme mit unserem Compiler, und führen das Programm stets ohne den debugger aus! ist ein häufiges problem an meiner schule hier!
was hat das jetzt zur folge, was beduetet das für das programm?
Dann mach es doch "Quick&Dirty", mach eine MessageBox, wo die Infos drinstehen..
Eigentlich sollte im SelectedItem so oder so die gewünschte Number drinstehen.
Eventuell kannst du ja den entsprechenden Code Abschnitt zeigen (so wie es jetzt aussieht).
lg Lion
Eine message box? ich werde den gedanken behalten, danke! Quick & Dirty ist genau das was ich will ^^ aber dazu brauch ich vermutlich etwas zeit das auszuprogrammieren
an dem Code hat sich nichts geändert (wie oben gepostet) er steht nur an einer anderen stelle, oder versteh ich dich nicht richtig?
Eine message box? ich werde den gedanken behalten, danke! Quick & Dirty ist genau das was ich will ^^ aber dazu brauch ich vermutlich etwas zeit das auszuprogrammieren
Hallo? sorry aber eine Messe box sollte man schon kennen... MessageBox.Show(). Guck dir das mal an.
bzw. du kannst auch im Relase Modus debuggen, nur da kannst du halt nichts ändern.
Lion
lg Lion
ja du hast wohl recht, ich werd mich jetzt mal dran versuchen!
was für vorteile bringt mir die message box?
wenn du uns nicht unterstützen willst (mit Informationen) dann können wir dir wohl auch herzlich wenig helfen, sorry aber eine Aussage, dass eine Messagebox "nicht einfach zu implementieren" ist halte ich nur für Faul, überhaupt wenn man den SQL String wissen möchte.
Da klatschte den vorgeschlagenden Code hin MessageBox.Show() mit deinem SQL Text als Parameter, wo wäre da das Problem bzw. wo ist das "nicht einfache"?
Wenn du öfters in dgv schreibst, vielleicht löscht dir ja eine andere Methode die Zeilen wieder raus.
Lion
€dit: Meine ersten Zeilen beziehen sich auf das ungeänderte Kommentar von Acor, werde es wohl aber auch so stehen lassen. 😃
lg Lion
du hast doch geschrieben, das du aufgrund eines unbekannten fehlers, nciht debuggen kannst. also ist die ausgabe durch die messagebox deine einzige möglichkeit zu einem bestimmten zeitpunkt definierte werte zu erfahren.
es gibt zwar noch andere möglichkeiten wie tracing usw aber das wäre hier jetzt zu kompliziert für dich.
im übrigen tendiert dieser thred stark richtung
Wichtig: [Hinweis] Wie poste ich richtig?
Punkt 1.1
Punkt 1.1.1
was für vorteile bringt mir die message box?
Wenn du nicht debuggen kannst? Dann siehst du eventuell Informationen die du gerne wissen möchstest, wie z.B. den SQL String an dieser Stelle, oder den Inhalt von SelectedItem, etc. dargestellen.
lg Lion
Entschuldigt, ich hab MessageBox gerade mit RichEdit (oder sowas) verwechselt! knoten im kopf, pardon
also ich hab messagebox.show(...) verwendet und er zeigt ihn mir an, der sql befehl passt soweit!
Dann würde ich trotzdem vorschlagen, dass du den ButtonClick Code postest, denn entweder hast du "drumherum" einen Fehler oder du löscht die Table von wo anders.
Ansonsten eben gesehen:
if (ds.Tables["Name"] != null)
{
ds.Tables["Name"].Clear();
}
ds.Clear();
Hier wäre das If und Tables[""].Clear() doch unnötig, da ds.Clear() sowieso alle reihen aus allen Tabellen löscht.
Lion
lg Lion
Ich bin das Problem umgangen!
Ich verzichte darauf die Daten ins DGV zu schreiben, da das ja offenbar aus unerklärlichen gründen nicht funktioniert. ich übertrage das Ergebnis der SELECT answeisung einfach direkt in einen String
string name = ds.Tables["Name"].Rows[0]["strForename"].ToString() + " " + ds.Tables["Name"].Rows[0]["strName"].ToString();
das ist in Ordnung so
Die redundante If-Anweisung hab ich wie empfohlen gelöscht, danke!
soweit funktioniert jetzt alles, ich danke euch für eure Hilfe
bis bald 😉
Wenn es so funktioniert, dann vermute ich, dass du das DGV an anderer Stelle löscht.
Unerklärlich ist es sicher nicht, wir kennen halt das drum herum nicht 😄
lg Lion
Vermutlich hast du recht dass es eine Erklärung gibt! Löschen ist es nicht, darauf hab ich geachtet!
Ich bin euch wirklich dankbar für euche Hilfe! tolles Forum
lg Arco