Form2 lasst keine Verbindung zu Datenbank zu

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 48 Antworten in diesem Thema. Der letzte Beitrag () ist von Akanel.

    Form2 lasst keine Verbindung zu Datenbank zu

    Hallo zusammen.
    Ich habe 2 Formen ( Form1 und Form2) und möchte mit einem Button auf Form1 halt Form2 aufrufen. Dies funktioniert auch.
    Wenn ich von Form2 nun Daten in eine Mysql Daenbank schreiben möchte, bekomme ich den Fehler Host " blabla" is not allowed to this MariaDB Server

    Wenn ich die Prozedur aber von Form1 aus probiere, funktioniert es.

    Hier der Code:

    Um Form2 aufzurufen:

    VB.NET-Quellcode

    1. Private Sub cmdNeuerKunde_Click(sender As System.Object, e As System.EventArgs) Handles cmdNeuerKunde.Click
    2. Dim KundenAnlegen As New KundenAnlegen
    3. KundenAnlegen.Show()
    4. End Sub


    Der Code in Form2

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class KundenAnlegen
    3. Dim sql As New SQLControl
    4. Private Sub cmdSpeichern_Click(sender As System.Object, e As System.EventArgs) Handles cmdSpeichern.Click
    5. Dim query As String = "INSERT INTO kunden (KundeName, Strasse, PLZ, Ort) VALUES ('" & txtKunde.Text & "','" & txtStrasse.Text & "','" & txtPLZ.Text & "','" & txtOrt.Text & "' )"
    6. Try
    7. Dim command = New MySqlCommand(query, Sql.SQLConnection)
    8. Sql.SQLConnection.Open()
    9. If IsNumeric(txtPLZ.Text) = True Then
    10. command.ExecuteNonQuery()
    11. txtKunde.Clear()
    12. txtStrasse.Clear()
    13. txtPLZ.Clear()
    14. txtOrt.Clear()
    15. MessageBox.Show("Neuen Kunden angelegt!")
    16. Else
    17. MessageBox.Show("Im Feld PLZ sind nur Zahlen zulässig.")
    18. txtKunde.Clear()
    19. txtStrasse.Clear()
    20. txtPLZ.Clear()
    21. txtOrt.Clear()
    22. sql.SQLConnection.Close()
    23. sql.SQLConnection.Dispose()
    24. Exit Sub
    25. End If
    26. Catch ex As Exception
    27. MessageBox.Show(ex.Message)
    28. End Try
    29. End Sub



    Habe ich etwas vergessen oder übersehen?

    Verschoben. ~Trade
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    auf Form1 fährt wohl ein anderes SqlControl herum als auf Form2.
    ich weiß nicht, was ein SqlControl ist, könnte mir aber vorstellen, dass das eine richtig eingerichtet ist, das andere nicht.

    Wärst du eiglich daran interessiert, Databinding zu erlernen, DataAdapter für dich arbeiten zu lassen, und vor allem Sql-Injection -Angriffe zu vermeiden (folge dem Link - dein Ansatz ist ein gefundenes Fressen für Sql-Injekter)?
    Hallo ErfinderDesRades,

    erstmal vielen Dank für deine Antwort.
    Natürlich bin ich daran interessiert Databindings zu erlernen. Wie ich schon in einem anderen Post schrieb, bin ich was VB angeht noch Anfänger, daher sein mir das verziehen.
    Da ich die Mysql Datenbank noch aus meine php Zeit kenne, dachte ich dies wäre der richtige weg. Leider lag ich falsch.

    Nachdem ich nun dein Tutorial "Daten Laden Speichern Verarbeiten" und "Dataset only" gefunden habe, denke ich sogar das ich nicht zwingend eine Datenbank brauche, und versuche mich mit dem Dataset Only.
    Da habe ich aber noch einige Punkte die mir unklar sind, und diese werde ich erst abarbeiten.

    Aber noch zu deiner Anmerkung bzgl. der SqlControl.
    SQLCOntrol ist einfach eine Klasse in der ich den Datenbank zugriff habe.

    VB.NET-Quellcode

    1. Public Class SQLControl
    2. Public ServerString As String = "Server=localhost; User=root; Database=gfbdb"
    3. Public SQLConnection As MySqlConnection = New MySqlConnection
    4. Public Function HasConnection() As Boolean
    5. SQLConnection.ConnectionString = ServerString
    6. Try
    7. If SQLConnection.State = ConnectionState.Closed Then
    8. SQLConnection.Open()
    9. Else
    10. SQLConnection.Close()
    11. End If
    12. Return True
    13. Catch ex As Exception
    14. MessageBox.Show(ex.Message)
    15. Return False
    16. End Try
    17. End Function
    18. End Class
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    also im ersten post ist mir schon aufgefallen, dass du im SqlControl die Connection disposest.
    Dann ist mir plausibel, dass sie beim 2. Mal nicht mehr funktioniert.

    Aber das ist ganz unwichtig. Sieh erstmal zu, dass du deine Anwendung DatasetOnly aufgebaut kriegst.
    Eine Datenbank kann man später da immer noch hinterlegen, und das geht im übrigen ganz anders, wenn mans effizient haben will und v.a. sicher gegen SqlInjection.

    Aber eins nachm anneren, und die Db ist einfach längst noch nicht dran. Konzentrier dich auf DatasetOnly, weil was du hier am Db-Zugriff rumhudelst, musst du später eh wieder in die Tonne treten.

    Noch ein Tipp: Fang nicht gleich mit 2 Forms an - zwei Forms richtig zu handeln ist ziemlich tricky. Eins nachm anneren.
    Also ich habe mich dazu entschlossen das ganze mit SQL wegzulassen und widme mich dem DataSet Only Prinzip. Das genügt meinen Ansprüchen vollkommen.

    Ich habe mir zu diesem Thema einiges Durchgelesen und auch einige Tutorials von Dir nachgebaut um das ganze besser verstehen zu könne. Ich habe das ganze auch soweit verstanden.
    Bei dem ganzen Lesen und Probieren bin ich auch auf dein MiniKass Tutorial gestoßen wo berechnete Spalten vorkommen. Das ganze ist natürlich schon umfangreich (für mich), und es kommt wieder etwas neues dazu.

    Ich habe mal versucht das ganze etwas auszubauen, was mich wieder vor ein Problem stellt.
    Wenn man die Bons einem Kunden zuordnen könnte, wäre das fast wie ein Rechnungsprogramm. Also habe ich eine weitere Tabelle namens "Kunden" angelegt. erstmal nur mit KundenID als PK und schliesslich Vornamen und Nachnamen. Als FK habe ich dann der Tabelle "Bon" eine Spalte KundenID verpasst. Sollte soweit richtig sein.

    Nun wird ja mittels DataSet.Bon.AddBonRow(Date.Now) ein neuer Bon angelegt wo der aktuelle Zeitstempel direkt eingetragen wird.
    Mit der neuen Relaton der Kundentabelle wirft diese Zeile allerdings einen Fehler auf, weil dort nun auch die KundenID übergeben werden muss.
    Jetzt stellt sich mir die Frage WIE? Eigentlich wird doch die KundenID in der Tabelle Bon von der Tabelle Kunden übernommen (Relation).
    Der Spalte Summe muss ich da ja auch keinen wert übergeben, da dies eine berechnete Spalte ist. Oder hat das einen anderen Grund, warum dieser Spalte kein Wert übergeben werden muss?

    Ich hoffe ich habe mich verständlich ausgedrückt.

    MfG Sven
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Ja, wenn du das Datenmodell änderst zieht das auch Änderungen im Code nach sich.
    Etwa die AddBonRow verlangt dann einen Wert für den Kunden, dem sie zugeordnet werden soll.

    Akanel schrieb:

    Eigentlich wird doch die KundenID in der Tabelle Bon von der Tabelle Kunden übernommen (Relation).
    Nein, denn woher soll der Bon-Datensatz denn wissen, zu welchem Kunden er gehören soll? Das musst du ihm schon sagen.
    Und daraus ergibt sich ein weiterer Effekt: Du wirst keine Bons mehr so anlegen können.
    Zunächstmal müssen Kunden angelegt sein, denn - so das neue Datenmodell - ohne Kunde kein Bon.

    Tatsächlich ist dann sogar die Bezeichnung "Bon" irreführend, denn eiglich handelt es sich in dem Moment, wo Bons Kunden zugeordnet sind, nicht mehr um Bons, sondern um Rechnungen.
    Und dann ist auch ganz menschlich logisch: Ohne Kunde kann es keine Rechnung geben. Und genau so verhält sich auch das Datenmodell.

    Also für dein Rechnungs-Programm brauchst du eine andere Oberfläche, eine, wo man zunächst Kunden anlegt und auswählt (kann im selben DGV passieren), und dann einen ParentChild-View, der von einem Kunden die Rechnungen (was früher Bon war) auflistet.
    (Übrigens, indem du Kunde->Rechnung als ParentChildView umsetzst, machst du tatsächlich den Rechnungen immer ihren Kunden bekannt, also tatsächlich kann mans so einrichten, dass die Rechnung den gemeinten Kunden automatisch übernimmt - aber man musses halt so einrichten.

    Jdfs freut mich regelrecht, dass du von dir aus die Datenbank nu zurückstellst, und dich erstmal dem widmest, was man tatsächlich vorher geschnackelt haben muss, um eine Datenverarbeitung aufzuziehen: nämlich Datenmodellierung und Databinding.
    Hab ich 2 Tuts zu:
    Datamodel for Beginners das sind 3 Artikel, die den ganzen Themenkomplex von Grund auf aufarbeiten
    vier Views-Videos das ist auf Deutsch, mit viele Videos - wenn man Vorkenntnisse hat, kann man damit evtl. superschnell einsteigen, aber ich empfehle eiglich lieber das gründliche auf englisch.
    Auf jeden Fall reingucken, um ein Feeling zu kriegen, worauf es hinausläuft, und wie verblüffend einfach es ist, wenn man die Prinzipien einhält, und ausserdem die Designer-Unterstützung für sich arbeiten lässt.
    Vielen Dank für Deine schnelle Antwort.

    Ich werde mir die von Dir genannten Links erstmal genau durchlesen und durcharbeiten, und dann versuchen das ganze aufzubauen.

    Wenn ich erfolg dabei habe, werde ich es Dich wissen lassen. :)
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo EdR,

    ich bin soweit durch mit den Seiten, und habe einen grossen schritt nach vorne gemacht was das Databinding angeht. Ich habe das Datenmodell hinbekommen das es so funktioniert wie ich es wollte.
    Allerdings habe ich nach wie vor ein problem damit, eine neue Rechnung anzulegen, da er noch weitere Daten verlangt. Aber das wird nicht der einzige weg sein, eine neue Rechnung anzulegen. Daher mache ich mir dazu noch ein paar Gedanken.

    Anbei mein bisheriges Ergebnis.

    LG

    Edit: bin Ordner aus dem Upload entfernt
    Dateien
    • Rechnung.rar

      (102,93 kB, 135 mal heruntergeladen, zuletzt: )
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Akanel“ ()

    Kannst du vlt. noch die bin-Ordner aus dem Upload rauswerfen?
    Die enthalten ausführbare Dateien, und derlei sollte man eiglich nicht uploaden. Ist auf VBP auch nur im ShowRoom erlaubt.

    Ich kann dir auch ein Tool von mir empfehlen, damit kann man mit einem Klick die Sources zippen - ausschließlich die Sources.
    Verwende ich sehr viel für Backups, und Backups sind enorm wichtig.
    Vor jedem größeren Umbauschritt sollte man mal drauf-klicken - einerseits falls die IDE sich mal verhaspelt, andererseits, um Vergleiche anstellen zu können, wenn man späterhin merkt, dass man was verschlimmbessert hat ;)

    Zum Prob mit dem Kunde anlegen: Du hast da unten links ja einen DetailView mit viele Labels.
    Wenn du stattdessen Textboxen nimmst, dann kannst du Kunden vernünftig anlegen + editieren, glaub ich.

    SolutionExplorer - OpenSource

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Die bin Ordner habe ich aus obigem Upload entfernt.

    Das mit dem Kunden anlegen ist nicht das Problem.
    Das problem das ich im moment habe ist eine Rechnung zu erstellen, wenn schon ein Kunde vorhanden ist.
    Wenn schon ALLES vorhanden ist funktioniert auch alles wie es soll. Aber der Tip mit den Kunden ist auch sehr hilfreich, denn da kann ich auch noch keinen mit ALLEN Daten anlegen.
    Mal schauen wie ich das löse. Ich habe da in deinen Tutorials schon einige Anregungen bekommen, wo ich mich mich mal einlese und es versuche zu verstehen und umzusetzen.

    Wenn Du bei meinen ganzen Sachen Fehler findest, bitte ich drum mir diese zu sagen. Denn nur daraus kann man lernen und es auch besser machen.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Akanel schrieb:

    Das problem das ich im moment habe ist eine Rechnung zu erstellen, wenn schon ein Kunde vorhanden ist.
    Das "Problem" verstehe ich nicht.
    Ist doch gut, wenn ein Kunde schon vorhanden ist!

    Wie gesagt - anders kann man logischerweise gar keine Rechnungen erstellen - wie soll man denn ohne Kunden eine Rechnung erstellen?
    Ich glaube ich habe mich nicht richtig ausgedrückt.

    Aktuell ist es so das ich keine Neuen Kunden anlegen kann. Nur die schon bestehenden bearbeiten, über die Textboxen die ich inzwischen eingebaut habe.
    Das DGV soll Readonly sein.
    Einen neuen Kunden anlegen möchte ich über einen Button und dem entsprechenden Template (dlgKunde) was ich schon erstellt habe.
    Mittels des selben Templates soll dann auch der Kunde bearbeitet werden können wenn ich im DGV auf den entsprechenden Kunden doppelKlicke.
    Da hänge ich derzeit noch fest wie genau ich diese Daten aus der BindingSource abrufe. Aber ich lese fleissig.

    bzgl der Rechnung. Wenn ich einen Kunden anwähle, kann ich derzeit keine Rechnung erstellen da im DGV nur die Datenfelder ID und Summe sind. Ich muss aber zu der Rechnung noch die Posten hinzufügen können. Sobald ich zu den Posten wechsel, verschwindet die erstellte Rechnung.
    Teste es bitte mal anhand des Uploads. Vielleicht habe ich da auch einen Fehler irgendwo.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    bzgl der Rechnung: ich sehe kein Problem - ich kann Rechnungen zufügen, ändern löschen speichern laden - wie sichs gehört.

    (achte auch auf die Größe des Uploades - SolutionExplorer zippt wirklich nur das nötige)
    (beachte auch, dass die Daten-Datei gleich mit drin ist - auch im SolutionExplorer sichtbar)
    Dateien
    • Rechnung00.zip

      (27,97 kB, 139 mal heruntergeladen, zuletzt: )
    Ich habe mich nun weiter in das Thema eingearbeitet, und nun klappt es auch so wie ich es möchte. Mir ist durchaus bewusst das der Code nicht 100%ig ist, aber ich lerne ja noch.

    Aktuell kann ich Kunden anlegen und bearbeiten. Dem angewählten Kunden kann ich dann auch Rechnungen zuweisen und den Rechnungen wiederrum einzelne Positionen.

    Nun möchte ich das ganze noch etwas erweitern und möchte zu dem ganzen auch eine Rechnung Drucken können. Soweit bekomme ich das auch hin. Allerdings an einem Punkt stoße ich auf ein Problem.

    Mittels Dim person = DirectCast(DirectCast(KundeBindingSource.Current, DataRowView).Row, KundeRow) kann ich mir ja den aktuell selectierten Kunden ausgeben lassen und mit Dim Rechnung = DirectCast(DirectCast(RechnungBindingSource.Current, DataRowView).Row, RechnungRow) die dazu angewählte Rechnung.

    Diese Daten kann ich dann mit Dim Empfänger As String = person.Nachname & " " & person.Vorname & vbCrLf & person.Strasse & vbCrLf & person.PLZ & " " & person.Ort und e.Graphics.DrawString(Empfänger, ft, br, New Point(60, 180)) ausdrucken.
    Mein Problem ist nun, wie kann ich nun gleichzeitig die Positionen die der Rechnung zugeteilt sind auslesen um sie auf dem Papier aufzulisten?
    Anbei noch mein aktueller Stand.
    Dateien
    • Rechnung00.zip

      (257,05 kB, 130 mal heruntergeladen, zuletzt: )
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Ich habe nun mittels einer schleife die Auflistung hinbekommen.

    VB.NET-Quellcode

    1. For i = 0 To KundeBindingSource.Count - 1
    2. Dim person2 = DirectCast(DirectCast(KundeBindingSource(i), DataRowView).Row, KundeRow)
    3. e.Graphics.DrawString(person2.Nachname & person2.Vorname & person2.Telefon, ft, br, rect3)
    4. Next

    Allerdings wird dann alles übereinander geschrieben. Wie kann ich es denn nun lösen das jeder Eintrag eine eigne Zeile bekommt?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    also dann proggst du wohl noch strict off, und bist dir deshalb nicht im Klaren darüber, was die DrawString-Methode eiglich für Parameter erwartet. Dass sie einen "Bruch" - was immer das sein soll, als vorletzten Parameter annimmt, halte ich für nahezu ausgeschlossen - da wird wieder sone unsichtbare strict-off-TypConvertierung stattfinden.
    Machma Rechtsklick auf "DrawString" und dann "zu Definition gehen" - das sollte den ObjectBrowser öffnen, und die genaue Definition der Methode angeben, die du da aufrufst.
    Die Summary und weitere Erklärungen kannste unten rechts auskopieren, und hier posten.

    Falls du ObjectBrowser noch nie gesehen hast: VisualStudio richtig nutzen (Google ist nicht deine Mami)
    Äh ne ne, ich programmiere schon Strict On.
    Ich denke du hast etwas zu schnell gelesen. Da steht “Brush“. Ich denke somit sieht du das ganze anders. ;)

    Edit:
    So Nun auch wieder zuhause und kann den Code nachliefern um das Brush aufzulösen.

    VB.NET-Quellcode

    1. Dim ft = New Font("Verdana", 11) ' der Druck-Font
    2. Dim br = Brushes.Black
    3. Dim rect3 As New Rectangle(60, 400, 500, 100)
    4. For i = 0 To KundeBindingSource.Count - 1
    5. Dim person2 = DirectCast(DirectCast(KundeBindingSource(i), DataRowView).Row, KundeRow)
    6. e.Graphics.DrawString(person2.Nachname & person2.Vorname & person2.Telefon, ft, br, rect3)
    7. Next
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Akanel“ ()

    Anbei mein derzeitiger Fortschritt. Codetechnisch noch nicht ganz so wie es vermutlich sein sollte, aber ich mache durch dieses kleine Projekt meine Fortschritte.

    Aktuell bin ich dabei die Rechnung auch Drucken zu können.

    Vorschläge und evtuelle Kritik gerne gesehen.
    Dateien
    • Rechnung00.zip

      (265,29 kB, 118 mal heruntergeladen, zuletzt: )
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.