Einfache Formulardaten in MS Access Tabellen speichern
-
Hallo Knuddlbaer
Besten Dank für alles. Ich habe bemerkt, dass ich den OleTableAdapter1 falsch geschrieben habe.
Wenn ich jetzt das Progrämmchen debugge bekomme ich wenigstens keine Fehlermeldungen mehr. Auch wenn ich die Daten jetzt ins Formular eingebe und auf den Button "speichern" klicke, verschwindet das Eingegebene. Und wenn ich meine AccessDB öffne um zu schauen, ob es wirklich gespeichert wurde Gähnende Leere.
Auch habe ich eine neue Datei auf dem Laufwerk, die den selben Namen trägt wie meine AccessDB mit der Endung *.ldb, welche ich mit dem Access nicht öffnen kann.
Kannst Du mir bitte nochmals helfen?
Danke und Gruss
-
Zeig mal den Quellcode der hinter Deinem Knopf liegt.
-
#pragma once namespace probieren { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Zusammenfassung für Form1 /// /// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch /// die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern, /// das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt. /// Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen /// arbeiten, die diesem Formular zugewiesen sind. /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::Label^ label1; protected: private: System::Windows::Forms::TextBox^ txtName; private: System::Windows::Forms::Label^ label2; private: System::Windows::Forms::TextBox^ txtVorname; private: System::Windows::Forms::DateTimePicker^ dateTimePicker1; private: System::Windows::Forms::Label^ label3; private: System::Windows::Forms::Button^ btnSpeichern; private: System::Data::OleDb::OleDbCommand^ oleDbSelectCommand1; private: System::Data::OleDb::OleDbConnection^ oleDbConnection1; private: System::Data::OleDb::OleDbCommand^ oleDbInsertCommand1; private: System::Data::OleDb::OleDbDataAdapter^ oleDbDataAdapter1; private: probieren::DataSet1^ dataSet11; private: System::Data::DataView^ dataView1; private: System::Windows::Forms::BindingSource^ testDBAdministrationBindingSource; private: System::Windows::Forms::BindingSource^ testDBAdministrationBindingSource1; private: System::Windows::Forms::BindingSource^ testDBAdministrationBindingSource2; private: System::ComponentModel::IContainer^ components; private: /// <summary> /// Erforderliche Designervariable. /// </summary> #pragma region Windows Form Designer generated code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> void InitializeComponent(void) { this->components = (gcnew System::ComponentModel::Container()); this->label1 = (gcnew System::Windows::Forms::Label()); this->txtName = (gcnew System::Windows::Forms::TextBox()); this->dataSet11 = (gcnew probieren::DataSet1()); this->label2 = (gcnew System::Windows::Forms::Label()); this->txtVorname = (gcnew System::Windows::Forms::TextBox()); this->dateTimePicker1 = (gcnew System::Windows::Forms::DateTimePicker()); this->label3 = (gcnew System::Windows::Forms::Label()); this->btnSpeichern = (gcnew System::Windows::Forms::Button()); this->oleDbSelectCommand1 = (gcnew System::Data::OleDb::OleDbCommand()); this->oleDbConnection1 = (gcnew System::Data::OleDb::OleDbConnection()); this->oleDbInsertCommand1 = (gcnew System::Data::OleDb::OleDbCommand()); this->oleDbDataAdapter1 = (gcnew System::Data::OleDb::OleDbDataAdapter()); this->dataView1 = (gcnew System::Data::DataView()); this->testDBAdministrationBindingSource = (gcnew System::Windows::Forms::BindingSource(this->components)); this->testDBAdministrationBindingSource1 = (gcnew System::Windows::Forms::BindingSource(this->components)); this->testDBAdministrationBindingSource2 = (gcnew System::Windows::Forms::BindingSource(this->components)); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->dataSet11))->BeginInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->dataView1))->BeginInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->testDBAdministrationBindingSource))->BeginInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->testDBAdministrationBindingSource1))->BeginInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->testDBAdministrationBindingSource2))->BeginInit(); this->SuspendLayout(); // // label1 // this->label1->AutoSize = true; this->label1->Location = System::Drawing::Point(24, 27); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(35, 13); this->label1->TabIndex = 0; this->label1->Text = L"Name"; // // txtName // this->txtName->DataBindings->Add((gcnew System::Windows::Forms::Binding(L"Text", this->testDBAdministrationBindingSource, L"Name", true))); this->txtName->Location = System::Drawing::Point(103, 24); this->txtName->Name = L"txtName"; this->txtName->Size = System::Drawing::Size(100, 20); this->txtName->TabIndex = 1; // // dataSet11 // this->dataSet11->DataSetName = L"DataSet1"; this->dataSet11->SchemaSerializationMode = System::Data::SchemaSerializationMode::IncludeSchema; // // label2 // this->label2->AutoSize = true; this->label2->Location = System::Drawing::Point(24, 53); this->label2->Name = L"label2"; this->label2->Size = System::Drawing::Size(49, 13); this->label2->TabIndex = 2; this->label2->Text = L"Vorname"; // // txtVorname // this->txtVorname->DataBindings->Add((gcnew System::Windows::Forms::Binding(L"Text", this->testDBAdministrationBindingSource1, L"Vorname", true))); this->txtVorname->Location = System::Drawing::Point(103, 50); this->txtVorname->Name = L"txtVorname"; this->txtVorname->Size = System::Drawing::Size(100, 20); this->txtVorname->TabIndex = 3; // // dateTimePicker1 // this->dateTimePicker1->CustomFormat = L"dd.MM.yyyy"; this->dateTimePicker1->DataBindings->Add((gcnew System::Windows::Forms::Binding(L"Text", this->testDBAdministrationBindingSource2, L"Geburtstag", true))); this->dateTimePicker1->Format = System::Windows::Forms::DateTimePickerFormat::Custom; this->dateTimePicker1->Location = System::Drawing::Point(103, 76); this->dateTimePicker1->Name = L"dateTimePicker1"; this->dateTimePicker1->Size = System::Drawing::Size(100, 20); this->dateTimePicker1->TabIndex = 4; // // label3 // this->label3->AutoSize = true; this->label3->Location = System::Drawing::Point(24, 80); this->label3->Name = L"label3"; this->label3->Size = System::Drawing::Size(73, 13); this->label3->TabIndex = 5; this->label3->Text = L"Geburtsdatum"; // // btnSpeichern // this->btnSpeichern->Location = System::Drawing::Point(82, 113); this->btnSpeichern->Name = L"btnSpeichern"; this->btnSpeichern->Size = System::Drawing::Size(75, 23); this->btnSpeichern->TabIndex = 6; this->btnSpeichern->Text = L"Speichern"; this->btnSpeichern->UseVisualStyleBackColor = true; this->btnSpeichern->Click += gcnew System::EventHandler(this, &Form1::btnSpeichern_Click); // // oleDbSelectCommand1 // this->oleDbSelectCommand1->CommandText = L"SELECT Name, Vorname, Geburtstag\r\nFROM Test_DB_Administration"; this->oleDbSelectCommand1->Connection = this->oleDbConnection1; // // oleDbConnection1 // this->oleDbConnection1->ConnectionString = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\AccessDB\\test_db.mdb"; // // oleDbInsertCommand1 // this->oleDbInsertCommand1->CommandText = L"INSERT INTO `Test_DB_Administration` (`Name`, `Vorname`, `Geburtstag`) VALUES (\?," L" \?, \?)"; this->oleDbInsertCommand1->Connection = this->oleDbConnection1; this->oleDbInsertCommand1->Parameters->AddRange(gcnew cli::array< System::Data::OleDb::OleDbParameter^ >(3) {(gcnew System::Data::OleDb::OleDbParameter(L"Name", System::Data::OleDb::OleDbType::VarWChar, 0, L"Name")), (gcnew System::Data::OleDb::OleDbParameter(L"Vorname", System::Data::OleDb::OleDbType::VarWChar, 0, L"Vorname")), (gcnew System::Data::OleDb::OleDbParameter(L"Geburtstag", System::Data::OleDb::OleDbType::Date, 0, L"Geburtstag"))}); // // oleDbDataAdapter1 // this->oleDbDataAdapter1->InsertCommand = this->oleDbInsertCommand1; this->oleDbDataAdapter1->SelectCommand = this->oleDbSelectCommand1; cli::array< System::Data::Common::DataColumnMapping^ >^ __mcTemp__1 = gcnew cli::array< System::Data::Common::DataColumnMapping^ >(3) {(gcnew System::Data::Common::DataColumnMapping(L"Name", L"Name")), (gcnew System::Data::Common::DataColumnMapping(L"Vorname", L"Vorname")), (gcnew System::Data::Common::DataColumnMapping(L"Geburtstag", L"Geburtstag"))}; this->oleDbDataAdapter1->TableMappings->AddRange(gcnew cli::array< System::Data::Common::DataTableMapping^ >(1) {(gcnew System::Data::Common::DataTableMapping(L"Table", L"Test_DB_Administration", __mcTemp__1))}); // // dataView1 // this->dataView1->Table = this->dataSet11->Test_DB_Administration; // // testDBAdministrationBindingSource // this->testDBAdministrationBindingSource->DataMember = L"Test_DB_Administration"; this->testDBAdministrationBindingSource->DataSource = this->dataSet11; // // testDBAdministrationBindingSource1 // this->testDBAdministrationBindingSource1->DataMember = L"Test_DB_Administration"; this->testDBAdministrationBindingSource1->DataSource = this->dataSet11; // // testDBAdministrationBindingSource2 // this->testDBAdministrationBindingSource2->DataMember = L"Test_DB_Administration"; this->testDBAdministrationBindingSource2->DataSource = this->dataSet11; // // Form1 // this->AcceptButton = this->btnSpeichern; this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(238, 150); this->Controls->Add(this->btnSpeichern); this->Controls->Add(this->label3); this->Controls->Add(this->dateTimePicker1); this->Controls->Add(this->txtVorname); this->Controls->Add(this->label2); this->Controls->Add(this->txtName); this->Controls->Add(this->label1); this->Name = L"Form1"; this->Text = L"Form1"; (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->dataSet11))->EndInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->dataView1))->EndInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->testDBAdministrationBindingSource))->EndInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->testDBAdministrationBindingSource1))->EndInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->testDBAdministrationBindingSource2))->EndInit(); this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion private: System::Void btnSpeichern_Click(System::Object^ sender, System::EventArgs^ e) { oleDbDataAdapter1->Fill(dataSet11); } }; }
-
Vorgehensweise
1. Form entwerfen
2. Textfelder umbenenen
3. oleDBTableAdapter1 auf Form ziehen
4. ->konfiguration mit Access DB
5. ->es entsteht eine Dbconnection1
6. oleDBTableAdapter1 ->DataSet generieren
7. DataView1 auf Form1 ziehen
8. DataSet11 in DataView1 beim Table einlesen
9. Textfelder mit (DataBindingSource Text ) ->Form1-Listeninstanzen->DataSet11->MeineAccessDB->Tabellen binden.
10. Doppelklick auf den Button (btnSpeichern) undprivate: System::Void btnSpeichern_Click(System::Object^ sender, System::EventArgs^ e) {
oleDbDataAdapter1->Update(dataSet11);
}
einfügen.
-
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.zipLege 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
-
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