Daten aus einer Formsanwendung in eine Datenbank einlesen



  • Hallo Leuete,
    nachdem Ihr mir bei meinem Problem letztes mal so super schnell geholfen habt, hoffe ich, dass ihr mir dieses mal auch wieder helfen könnt.
    Ich bin absoluter Anfänger und muss für die Uni eine Datenbank in postgresql schreiben, auf diese soll mit einer Windowsforms anwendung zugegriffen werden.
    Die Verbindung zur Datenbank klappt schon, doch beim Einschreiben der Daten in die Datenbank hänge ich irgendwie.

    Mein Code:

    #pragma endregion
    
    		int dbConnectStatus = 0;
    		PGconn *conn = NULL; //DB-Handle definieren
    
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    
    	PQsendQuery(conn, "INSERT INTO test VALUES (Hans, Meier, 12.06.2015) "); //VALUES (Hans, Meier, 21.05.2016)");
    
    	MessageBox::Show("Daten eingetragen");
    
    }
    
    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
    
    	conn = PQconnectdb("user=postgres dbname=testderfunktion hostaddr=127.0.0.1 port=5432");
    	//Fehler in Verbindungaufbau abfangen 
    	if (PQstatus(conn) != CONNECTION_OK)
    	{
    		MessageBox::Show("Konnte keine Verbindung zur DB aufbauen.\n");
    		//PQfinish(conn); 
    	}
    	else { MessageBox::Show("Verbindung zur DB - OK\n"); }
    	dbConnectStatus = 1;
    	//PQfinish(conn);
    
    }
    };
    }
    

    Wenn ich es richtig gelesen habe, dient PQsendQuery(conn, "INSERT INTO test VALUES (Hans, Meier, 12.06.2015) dazu, einen Befehl an das SQL Programm zu schicken, das INSERT INTO soll der Befehl sein, der Ausgeführt werden soll und in den Klammern stehen die Einträge die in die DB geschrieben werden sollen. Wenn ich das Programm kompiliere, läuft alles gut, keine Fehlermeldungen. Leider werden die Einträge aber nicht in die Datenbank übertragen.
    Habe ich irgendwo einen Fehler gemacht oder muss ich einen anderen Befehl verwenden? 😕

    Mit freundlichen Grüßen

    Christian



  • So wie ich das sehe mehrere. Wenn du mich fragst ist der InsertQuery unvollständig.

    Ich empfehle dir, einen ADO.NET Provider zum Zugriff zu verwenden. Zum Beispiel:
    npgsql.

    Der bietet Standardisierte Schnittstellen auf Basis der Interfaces und Basisklassen aus dem Namespace System.Data.



  • Du mußt auch SQL beherrschen:

    INSERT INTO test VALUES ('Hans', 'Meier', '12.06.2015')
    

    Besser ist es jedoch die Spalten explizit anzugeben:

    INSERT INTO test (Vorname, Nachname, Geburtstag) VALUES ('Hans', 'Meier', '12.06.2015')
    

    (oder wie auch immer die Tabellenspalten heißen).

    Außerdem ist PQsendQuery sicherlich die falsche Funktion, denn du sendest ja keine Abfrage - probiere mal PQexec.
    Und immer das Ergebnis der Funktion abfragen: PQresultStatus, s.a. libpq: Command Execution Functions.

    PS: Und editiere deinen Beitrag und füge [/code] bei deinem Code ein.



  • Hallo,

    da ich es jetzt durch das Highlighting erst gesehen habe. Erstelle dir doch bitte eine Datenzugriffsklasse. Gewöhn dir am besten garnicht erst an Datenmanipulationen und Ermittlungen direkt im GUI zu machen.



  • Guten Morgen Leute,
    ich habe meinen Fehler gefunden, es funktioniert schon mit dem PQsendQuery, ich habe im Source Code '' vergessen.
    Ich zeige es euch am Code:

    PQsendQuery(conn,  "INSERT INTO test (name, titel, erschienen) VALUES ('Hans', 'Meier', '12.06.2015') "); //VALUES (Hans, Meier, 21.05.2016)");
    

    Ein wirklich dummer Fehler.



  • Was Th69 ja auch bereits geschrieben hat.



  • Hatte ich heute morgen nich gesehen. Sorry



  • Ich bins nochmal,
    ich hänge noch immer bei meinem Programm. Die eingetragenen Werte zu übergeben klappt, jetzt versuche ich schon den halben Tag die Eingaben der Textfelder zu übergeben. Dazu muss ich soweit ich das verstanden habe, den System::String in ein const char* umwandeln, dies mache ich mit den marshal Befehlen. Dazu fand ich etwas auf der Microsoft Website.

    Ich definiere mir meine Variablen name, titel und erschienen al const char*.

    Dann möchte ich die Werte aus den Variablen an den INSERT INTO Befehl übergeben.

    Ich bekomme keine Fehlermeldung, er trägt in die Tabelle der Datenbank aber nur die eingegebenen Werte ein, ich vermute das ich dort einen Fehler habe.

    #pragma endregion
    
    		const char* name;
    		const char* titel; 
    		const char* erschienen;
    
    		marshal_context^ context = gcnew marshal_context();
    
    		int dbConnectStatus = 0;
    		PGconn *conn = NULL; //DB-Handle definieren
    
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    
    	using msclr::interop::marshal_as;
    
    	name = context->marshal_as<const char*>(n_name_e->Text);
    	titel =  context->marshal_as<const char*>(n_titel_e->Text);
    	erschienen = context->marshal_as<const char*>(n_erschienen_e->Text);
    
    	PQsendQuery(conn,  "INSERT INTO test (name, titel, erschienen) VALUES ('name', 'titel', 'erschienen') "); //VALUES (Hans, Meier, 21.05.2016)");
    
    	//PQsendQuery(conn, "INSERT INTO test (name, titel, erschienen) VALUES ('Peter', 'Horst', '01.01.1041') ");
    
    	//textboxen leeren
    
    	n_name_e->Clear();
    	n_titel_e->Clear();
    	n_erschienen_e->Clear();
    }
    

    Die Headerdteien habe ich eingebunden.



  • Ich bleibe bei meiner ersten Antwort. Nutze den ADO.NET Provider. Der nimmt direkt System.String entgegen.

    Außerdem musst du deinem Query auch die Werte übergeben. Bisher hast du darin feste Zeichenketten. Das ist natürlich quatsch.

    System::String^ query = System::String::Format("INSERT INTO test (name, titel, erschienen) VALUES ('{0}', '{1}', '{2}')", name, titel, erschienen);
    

    // EDIT: bzgl. des ADO.NET Providers

    Da es sauberer ist, Parameter zu übergeben kannst du beim ADO.NET Provider diese explizit angeben, wie es auch im verlinkten Beispiel zu sehen ist.

    System::String^ connString = "Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase";
    
    using (IDbConnection^ conn = gcnew NpgsqlConnection(connString))
    {
        conn->Open();
    
        // Insert some data
        using (IDbCommand^ cmd = new NpgsqlCommand())
        {
            cmd->Connection = conn;
            cmd->CommandText = "INSERT INTO test (name, titel, erschienen) VALUES (@name, @titel, @erschienen)";
            cmd->Parameters->AddWithValue("name", name);
            cmd->Parameters->AddWithValue("titel", titel);
            cmd->Parameters->AddWithValue("erschienen", erschienen);
            cmd->ExecuteNonQuery();
        }
    }
    


  • Das hatte ich ja schon geschirieben, dass ich vermutet habe, dass ich dort die Werte nicht richtig übergebe.
    Wie kann ich die Werte im jetzigen Code richtig übergeben? Sprich wie deklariere ich im Code, dass

    'name','titel','erschienen'
    

    der Inhalt der Textfelder sein sollen.

    Mit dem ADO.net schaue ich gerade, bin mir aber unsicher da ich absoluter Anfänger bin.



  • Hallo,
    wen ich versuche Npgsql zuinstallieren kommt folgende Meldung:

    PM> Install-Package Npgsql
    Es wird versucht, Abhängigkeitsinformationen für das Paket "Npgsql.3.2.4.1" bezüglich des Projekts "Test der Funktion" mit dem Ziel "native,Version=v0.0" zu erfassen.
    Es wird versucht, Abhängigkeiten für das Paket "Npgsql.3.2.4.1" mit dem DependencyBehavior "Lowest" aufzulösen.
    Aktionen zum Installieren des Pakets "Npgsql.3.2.4.1" werden aufgelöst.
    Aktionen zum Installieren des Pakets "Npgsql.3.2.4.1" wurden aufgelöst.
      GET https://api.nuget.org/packages/npgsql.3.2.4.1.nupkg
      OK https://api.nuget.org/packages/npgsql.3.2.4.1.nupkg 53ms
    "Npgsql 3.2.4.1" wird installiert.
    Installationsfehler. Ein Rollback wird ausgeführt...
    Das Paket "Npgsql.3.2.4.1" ist im Projekt "Test der Funktion" nicht vorhanden.
    Das Paket "Npgsql.3.2.4.1" ist im Ordner "C:\Users\acer\Documents\Visual Studio 2015\Projects\Test der Funktion\packages" nicht vorhanden.
    Install-Package : Das Paket "Npgsql 3.2.4.1" konnte nicht installiert werden. Sie versuchen, dieses Paket in ein Projekt zu installieren, das sich auf "native,Version=v0.0" be
    zieht, das Paket enthält aber keine Assemblyverweise oder Inhaltsdateien, die mit diesem Framework kompatibel sind. Wenden Sie sich an den Paketersteller, um weitere Informati
    onen zu erhalten.
    Bei Zeile:1 Zeichen:16
    + Install-Package <<<<  Npgsql
        + CategoryInfo          : NotSpecified: (:) [Install-Package], Exception
        + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand
    
    PM>
    

    In welchen der Ordner muss ich das Programm einfügen?



  • Ja deine Installation schlägt fehl. Du musst schon das Framework entsprechend wählen, dass du die Datei auch einbinden kannst.

    Wieso hast du native Kompilierung aktiv? Das könnte ein Grund sein, dass die Installation des Packages nicht funktioniert.


Anmelden zum Antworten