Einfache Formulardaten in MS Access Tabellen speichern



  • Mal abgesehen davon, das Du NUR das Posten solltest was den Code in Deinem Knopf betrifft:

    10. Doppelklick auf den Button (btnSpeichern) und

    private: System::Void btnSpeichern_Click(System::Object^ sender, System::EventArgs^ e) {
    oleDbDataAdapter1->Update(dataSet11);

    private: System::Void btnSpeichern_Click(System::Object^  sender, System::EventArgs^  e) { 
                     oleDbDataAdapter1->Fill(dataSet11); 
                 }
    

    Denk mal drüber nach.



  • Mit dem Update "Befehl" passiert leider nichts 😞



  • Oh man... Seit ihr zu zweit ?

    private: System::Void btnSpeichern_Click(System::Object^  sender, System::EventArgs^  e) { 
                     oleDbDataAdapter1->Fill(dataSet11); 
                 }
    

    Wo bitte ist da ein Update ?



  • Nein.

    Aber diese Methode "Fill" habe ich jetzt im Einsatz. Es passiert leider nichts, ausser dass es mir ein gleichnamige neue ldb-Datei auf der Festplatte schreibt... 😞



  • Ich bekomme auch beim Debuggen die Warnung "Nicht genügend Platz auf dem Datenträger; Verknüpfung erfolgt nicht inkrementell"



  • 1. Ohne Update gibts keine Daten in die Datenbank
    2. hast Du die DB zum Projekt hinzugefügt und angeklickt, das diese jedesmal neu kopiert werden soll ? Wo schreibt er Dir denn die neue DB hin ?



  • Das Programm schreibt die "neue" AccessDB- Datei (ldb) ins gleiche Verzeichnis
    wie die einzufüllende DB...



  • Wenn ich jetzt die Update Methode wieder einsetze, verschwindet die ldb Datei in meinem Verzeichnis



  • Wenn ich auf oleDBTableAdapter1 klicke, sehe ich in den Eigenschaften, dass der UpdateCommand auf (Keine) ist. Wenn ich die Combobox öffne, habe ich "Vorhanden, Neu und Keine" zur Auswahl.



  • Na dann denk mal ein wenig über das was Du da treibst nach....



  • über was denn? Wenn ich das programmieren könnte, wäre ich nicht hier.

    Kannst Du mir da bei meinem Problem hier weiterhelfen?



  • Guten Tag Knuddlbaer

    Wie geht's?

    Zu meinem Problem nochmals. Ich sagte ja ganz am Anfang, dass ich ein Anfänger in der C++/CLI Programmierung bin.

    Ich habe nochmals eine Frage bzgl. der "neuen" DB (ldb). Ich habe das Gefühl, dass diese Daten nicht in die DB geschrieben werden sondern ein Neues File generiert. Wo ist der Programmierfehler und wie kann ich dieses korrigieren?

    Habe besten Dank für Deine nette und sehr geschätzte Antwort.

    Gruss



  • Sorry, ich wüsste da nicht wie ich helfen soll.

    Du schreibst den Variablennamen nicht richtig und fragst dann hier nach wo der Fehler ist. Verwendest für jedes Textfeld ne eigene BindingSource, verwendest Fill zum Aktualisieren der Daten.

    Dann scheint das System nicht rund zu laufen:

    Ich bekomme auch beim Debuggen die Warnung "Nicht genügend Platz auf dem Datenträger; Verknüpfung erfolgt nicht inkrementell"

    Dann ist der UpdateCommand leer. Das müsste beim Versuch Update zu verwenden eine Exception auslösen, davon schreibst Du aber nichts. (Ok, Du verwendest ja auch Fill zur Aktualisierung).

    Die geposteten Links hast Du Dir daher vermutlich nicht angesehen. Du wirst Dir vermutlich auch nicht die MSDN angesehen zum Thema oleDbAdapter angesehen zu haben.

    Das hat IMHO nichts mit Anfänger zu tun, eher damit, das man einfach keine eigene Energie einsetzen möchte.

    Mir fehlt die Idee wie ich unter den Umständen helfen soll und neige dazu, die Antworten in gleicher Qualität zu liefern. Und genau davon möchte ich weg. (Ich drücke mich ohnehin schon ungeschickt aus und bin so unnötig mit Leuten hier zusammengerauscht).

    Mir fehlt auch im Moment für lange Diskussionen die Zeit.
    Hier mal ein Beispiel:
    http://www.rothmichael.de/cpp/DatenbankBeispiel.zip

    Lege im Laufwerk C: ein Ordner t an und entpacke das Archiv dorthin.
    Ich hatte jetzt keine Zeit die Datenquelle so einzurichten, das sie keinen
    festen Pfad o.Ä. braucht.

    Das Dataview hat in diesem Beispiel keinen wirklichen nutzen, lässt Dich aber später ohne aufwand Filter setzen.



  • Btw.: Wenn Du nicht unbedingt C++/CLI machen musst/willst, lohnt sich ein Blick auf C#

    Zwar ist C++/CLI hier IMHO genauso mächtig wie C# (IMHO sogar überlegen, wobei ich noch wenig C# Erfahrung habe) - ABER um mal das wiederzugeben was nn sagte:

    Man muss sich in C++/CLI im Probleme kümmern die man in C# nicht hat. Für C# gibt es für jeden kram nen Wizzard oder nen Template. In C++/CLI macht man einiges per Hand oder ärgert sich mit Bugs im Formdesginer rum (was ich sehr sehr schade finde :o( ) (Damit ist jetzt nicht die Namensauflösung gemeint, die gefällt mir in C++ besser. In C#/VB gibt es die Variable einfach, ich kann Strukturen ansprechen bevor diese bekannt sind etc. Das macht mir persönlich Probleme)



  • Hi,

    Besten Dank für den Link. Ich werde diesen gleich ausprobieren.

    Rechtherzlichen Dank für Deine Unterstützung.

    Greez 🙂



  • @Phil74

    Könntest du mir deinen Projekt mal mailen, da ich es nicht weiterkomme.

    @Alle

    Hier mein Quellcode:

    void VerbindungHerstellen() {
    	OleDb::OleDbConnectionStringBuilder^ stringBuilder = gcnew OleDb::OleDbConnectionStringBuilder();
    	stringBuilder->DataSource = "F:\\Visual Studio 2005\\Projects\\Datenbank\\test.mdb";
    	stringBuilder->Provider = "Microsoft.Jet.OLEDB.4.0";
    
    	OleDb::OleDbConnection^ conn = gcnew OleDb::OleDbConnection(stringBuilder->ConnectionString);
    
    	try {
    		conn->Open();
    	} catch (String ^s) {
    		System::Windows::Forms::MessageBox::Show(s);
    	}
    
    	OleDb::OleDbCommand^ selectCommand = gcnew OleDb::OleDbCommand();
    	selectCommand->CommandText = "SELECT Datum, Gesamtsumme FROM Abrechnung";
    	selectCommand->Connection = conn;
    
    	OleDb::OleDbCommand^ insertCommand = gcnew OleDb::OleDbCommand();
    	insertCommand->CommandText = "INSERT INTO `Test_DB_Administration` (`Datum`, `Gesamtsumme`) VALUES (\?, \?)";
    	selectCommand->Connection = conn;
    
    	OleDb::OleDbDataAdapter^ adapter = gcnew OleDb::OleDbDataAdapter();
    	adapter->SelectCommand = selectCommand;
    	adapter->InsertCommand = insertCommand;
    
    	conn->Close();
    
    }
    

    Jetzt komme ich nicht mehr weiter. Wie kann ich jetzt z.B. Daten auslesen, neue Zeilen hinzufügen? ...

    Stimmt der Code überhaupt?

    Danke



  • Schau Dir OleDbAdatper->Fill an, DataSet , DataView .



  • Ich habe mir jetzt mal die drei Sachen angesehen. Dann habe ich den Code ausgebaut:

    void VerbindungHerstellen() {
    	OleDb::OleDbConnectionStringBuilder^ stringBuilder = gcnew OleDb::OleDbConnectionStringBuilder();
    	stringBuilder->DataSource = "F:\\Visual Studio 2005\\Projects\\Datenbank\\db1.mdb";
    	stringBuilder->Provider = "Microsoft.Jet.OLEDB.4.0";
    
    	OleDb::OleDbConnection^ conn = gcnew OleDb::OleDbConnection(stringBuilder->ConnectionString);
    
    	try {
    		conn->Open();
    	} catch (String ^s) {
    		System::Windows::Forms::MessageBox::Show(s);
    	}
    
    	OleDb::OleDbCommand^ selectCommand = gcnew OleDb::OleDbCommand();
    	selectCommand->CommandText = L"SELECT NameIndex FROM Tabelle1 " +
            "WHERE Name = ? AND Vorname = ?";
    	selectCommand->Connection = conn;
    	selectCommand->Parameters->Add("Name", OleDb::OleDbType::VarWChar, 15);
    	selectCommand->Parameters->Add("Vorname", OleDb::OleDbType::VarWChar, 15);
    
    	OleDb::OleDbCommand^ insertCommand = gcnew OleDb::OleDbCommand();
    	insertCommand->CommandText = L"INSERT INTO `Tabelle1` (`Name`, `Vorname`) VALUES (\?, \?)";
    	insertCommand->Connection = conn;
    	insertCommand->Parameters->Add("Name", OleDb::OleDbType::VarWChar, 15, "Name");
    	insertCommand->Parameters->Add("Vorname", OleDb::OleDbType::VarWChar, 15, "Vorname");
    
    	OleDb::OleDbCommand^ deleteCommand = gcnew OleDb::OleDbCommand();
    	deleteCommand->CommandText = L"DELETE * FROM `Tabelle1` WHERE Name = ? AND Vorname = ?";
    	deleteCommand->Connection = conn;
    	deleteCommand->Parameters->Add("Name", OleDb::OleDbType::VarWChar, 15, "Name");
    	deleteCommand->Parameters->Add("Vorname", OleDb::OleDbType::VarWChar, 15, "Vorname")->SourceVersion= DataRowVersion::Original;
    
    	OleDb::OleDbCommand^ updateCommand = gcnew OleDb::OleDbCommand();
    	updateCommand->CommandText = L"UPDATE `Tabelle1` SET Name = ?, Vorname = ? " +
            "WHERE NameIndex = ?";
    	updateCommand->Connection = conn;
    	updateCommand->Parameters->Add("Name", OleDb::OleDbType::VarWChar, 15, "Name");
    	updateCommand->Parameters->Add("Vorname", OleDb::OleDbType::VarWChar, 15, "Vorname")->SourceVersion= DataRowVersion::Original;
    
    	OleDb::OleDbDataAdapter^ adapter = gcnew OleDb::OleDbDataAdapter();
    	adapter->SelectCommand = selectCommand;
    	adapter->InsertCommand = insertCommand;
    	adapter->DeleteCommand = deleteCommand;
    	adapter->UpdateCommand = updateCommand;
    
    	DataSet^ dataSetBuf = gcnew DataSet();
    	adapter->Fill(dataSetBuf);
    
    	DataView^ dataViewBuf = gcnew DataView();
    
    	conn->Close();
    
    }
    

    Aber bei adapter->Fill bekomme ich immer Folgende Fehlermeldung:

    Eine nicht behandelte Ausnahme des Typs "System.Data.OleDb.OleDbException" ist in System.Data.dll aufgetreten.

    Zusätzliche Informationen: Parameter?_1 hat keinen Standardwert.

    Muss man bei DataSet etwas weiteres Einstellen?
    Wie kann ich DataView mit DataSet verbinden?

    Welche bedeutung haben die Parameter bei den Commands. Sind diese in Ordnung?

    Meine Access-Datenbank sieht folgendermaßen aus:

    NameIndex | Name | Vorname
    ___________________________
    ||_____

    NameIndex ist der Primärschlüssel und ist vom Typ "AutoWert".
    Name und Vorname sind vom Typ "Text" mit der Feldgröße von 50.
    Die Tabelle heißt "Tabelle1"


Anmelden zum Antworten