Laden...

dataGridView aus einer Datenbank befüllen

Erstellt von Arco vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.417 Views
A
Arco Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren
dataGridView aus einer Datenbank befüllen

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

Gelöschter Account
vor 15 Jahren

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

A
Arco Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

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!

U
237 Beiträge seit 2007
vor 15 Jahren

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

J
3.331 Beiträge seit 2006
vor 15 Jahren

Hallo,

was liefert denn SelectedItem? Passt vielleicht SelectedIndex besser oder sogar SelectedText?

Unabhängig davon sind wirklich SQL-Parameter dringendst zu empfehlen! Jürgen

Gelöschter Account
vor 15 Jahren

Mit Like stürzt er ab bei der Befehlszeile, außerdem funktionieren andere SQL-Befehle bereits mit der Formulierung WHERE intNumber = " +....

integervergleiche != stringvergleiche
wenn du verstehst, was der ausdruck bedeutet.

zeig mal, wie du das like verwendet hast?

A
Arco Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

@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();

Gelöschter Account
vor 15 Jahren

ja, das habe ich mir gedacht. strings müssen in in sql in ' eingeschlossen sein, wenn du sie verwenden willst.

J
3.331 Beiträge seit 2006
vor 15 Jahren

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

Gelöschter Account
vor 15 Jahren

Aber auch damit das nicht beachtet werden muss, sind Parameter vorzuziehen.

bin vollständig deiner meinung.

A
Arco Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

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?

L
770 Beiträge seit 2006
vor 15 Jahren

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

A
Arco Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

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! ^^

L
770 Beiträge seit 2006
vor 15 Jahren

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

A
Arco Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

^^ 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?

L
770 Beiträge seit 2006
vor 15 Jahren

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

A
Arco Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

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?

Gelöschter Account
vor 15 Jahren

aber dazu brauch ich vermutlich etwas zeit das auszuprogrammieren

????

MessageBox.Show("das was ich anzeigen lassen will");
L
770 Beiträge seit 2006
vor 15 Jahren

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

A
Arco Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

ja du hast wohl recht, ich werd mich jetzt mal dran versuchen!

was für vorteile bringt mir die message box?

L
770 Beiträge seit 2006
vor 15 Jahren

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

Gelöschter Account
vor 15 Jahren

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

L
770 Beiträge seit 2006
vor 15 Jahren

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

A
Arco Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

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!

L
770 Beiträge seit 2006
vor 15 Jahren

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

A
Arco Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

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 😉

L
770 Beiträge seit 2006
vor 15 Jahren

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

A
Arco Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

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