Problem mit oleDbAdaper und Access HILFE!!!
-
Hi Leute,
ich habs fast hinbekommen. Erstens ist meine Access Datenbank im Projekt eingebunden nicht per Datenbank-Explorer sondern über oleDbAdapter und das funktioniert auch ganz gut. Jedoch hab ich noch eine Schwierigkeit mit der Zusammenarbeit beim Adapter -> Dataset -> Datebinding.
Ich hatte es mal geschafft, dass durch diese dataAdapter->Fill(dataSet1) Methode die Daten übernommen wurden und tatsächlich konnte ich die auch auf meinem Bildschirm sehen. Jedoch beim bearbeiten, speichern usw gibts noch Probleme. Kann mir jemand da den ein oder anderen Tipp geben.
Hier ein Pic zum Programm:
http://i1.fastup.de/show.asp?file=pic(3).jpg
Danke für eure Antworten.
-
Hallo Ag3nt...
hast Du es damit schon mal probiert?
this->Validate(); this->kontakteBindingSource->EndEdit();
Kriege Deine Datenbank nicht geladen!?
Gruß Doug_HH
-
Hehe Danke dir
Hab das Problem glaub ich gefunden und nun klappts ^^
Wie lautet denn eine einfach UPDATE SQL SYNTAX?
Hab folgendes drin stehen:UPDATE Kontakte SET Firma = ?, Vorname = ?, Nachname = ?, Strasse = ?, Plz = ?, Ort = ?, Telefon = ?, Telefax = ?, [E-Mail] = ?, Internet = ?, Kommentar = ?, id = WHERE (id = ?)
-
Hallo Ag3nt,
hoffe ich kann Dir damit helfen.
Mit dem Update Statement können wir einen oder mehrere Datensatz verändern. Sinnvoll ist dieses Statement ebenfalls in der Kombination mit WHERE. Angenommen wir möchten die Postleitzahl und den Ort des ersten Kunden ändern, weil dieser umzieht. Dazu bräuchten wir folgende Query: [b]UPDATE kunden SET Postleitzahl = '47110', Ort = 'Musterdorf' WHERE Kundennummer = 1[/b]
-
Nun hab ich mir dem Datenbank-Abfrage Generator diese Query erstellt. Aber wie sag ich dem das bei der Spalte Firma der Wert von textbox1 rein soll? Im Generator kann ich kein textbox1->Text einfügen.
Und wofür ist das @Vorname oder @Firma etc ... ?
-
Was spricht denn dagegen, die Textboxen direkt an das BindingSource zu binden ? Dann musst Du Dir um solche Dinge keinen Kopf machen!
-
Knuddlbaer schrieb:
Was spricht denn dagegen, die Textboxen direkt an das BindingSource zu binden ? Dann musst Du Dir um solche Dinge keinen Kopf machen!
Wie meinst du das?
und nochmals wofür steht @Name
-
Na, das was IMHO vorhast, kann man einfach zusammenklicken. Wenn ich das hier richtig verstehe, willst Du die Update Statements selbst absetzen. Das kann man natürlich machen, man kann aber auch einfach das Framework dafür benutzen!
Schau Dir Deine Textbox an. Da gibt es (DataBindings). Das klappst Du auf und packst Text einfach auf entsprechende Feld Deiner Datenbank.
-
Knuddlbaer schrieb:
Na, das was IMHO vorhast, kann man einfach zusammenklicken. Wenn ich das hier richtig verstehe, willst Du die Update Statements selbst absetzen. Das kann man natürlich machen, man kann aber auch einfach das Framework dafür benutzen!
Schau Dir Deine Textbox an. Da gibt es (DataBindings). Das klappst Du auf und packst Text einfach auf entsprechende Feld Deiner Datenbank.
Genau das ist bereits passiert und ich sehe auch die Daten und kann diese auch editieren aber speichern nicht, daher tippe ich darauf, dass es an der SQL Query liegt für UPDATE man kann ja alle gesondert bearbeiten und bei Update hab ich gesehen das nur ? ? ? ? drin stehen also kein Bezug auf die Textboxen haben ...
Hab ein neues Screenshot für fertig schau mal.
http://i1.fastup.de/show.asp?file=pic2(2).jpg
Fenster 1 wenn ich hier etwas editieren will kommt solch ein Fehler!
Und bei 2 siehste meine Update Abfrage
-
Ah jetzt hats auch der Bär geschnallt =o)
UPDATE Kontakte
SET Firma = ?, Vorname = ?, Nachname = ?, Strasse = ?, Plz = ?, Ort = ?, Telefon = ?, Telefax = ?, [E-Mail] = ?, Internet = ?, Kommentar = ?, id =
WHERE (id = ?)UPDATE Kontakte
SET Firma = ?, Vorname = ?, Nachname = ?, Strasse = ?, Plz = ?, Ort = ?, Telefon = ?, Telefax = ?, [E-Mail] = ?, Internet = ?, Kommentar = ?, id = ?
WHERE (id = ?)[quote]
Da fehlt ein ? bei der id
-
Ok Danke
Ich probier es mal aus.
Wofür steht das ---> ? <----
-- Nachtrag --
Es geht noch immer nicht wenn ich bei id = ? mache sagt er mir id kann nicht bearbeitet werden ... und wenn ich id komplett raus nehme also nur in der where klausel drin lasse kommt wieder ein fehler:
Paralelitätsverletzung: Der UpdateCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt. (Rotes Symbol mit !)
Was nu?
PS: Ich weiß wir habe mal im Kurs mit @name blabla gearbeitet hab nur keinen Schimmer mehr ob man das hier einsetzten kann und wofür das steht ...
PS: Mit folgendem Ereignis speicher ich die DB nach änderung:
private: System::Void toolStripButton2_Click(System::Object^ sender, System::EventArgs^ e) { try { this->Validate(); this->kontakteBindingSource->EndEdit(); this->oleDbDataAdapter1->Update(DataSet1->Kontakte); } catch (...) { MessageBox::Show("Beim Speichern ist ein Fehler aufgetreten!\nBitte überprüfen Sie Ihre Eingaben.", "Fehler", MessageBoxButtons::OK, MessageBoxIcon::Error); } }
-
Wieso nimmst Du nicht das Statement, das der Wizzard vorgegeben hat ? (In diesem sind auch noch einige Prüfungen drinne).
Die Fragezeichen stehen für Platzhalter, die später gefüllt werden. Wenn Du einfach in dem SQL Statement rumfriemelst, musst Du auch die Parameter per Hand ändern. Wenn die nicht aufeinander passen, gibt es an sich einfach nur undefiniertes Verhalten.
-
Knuddlbaer schrieb:
Wieso nimmst Du nicht das Statement, das der Wizzard vorgegeben hat ? (In diesem sind auch noch einige Prüfungen drinne).
Die Fragezeichen stehen für Platzhalter, die später gefüllt werden. Wenn Du einfach in dem SQL Statement rumfriemelst, musst Du auch die Parameter per Hand ändern. Wenn die nicht aufeinander passen, gibt es an sich einfach nur undefiniertes Verhalten.
Also irgendwie hab ich das Gefühl, dass du dich kaum damit auskennst... Ich meine meine Frage war doch ganz simple. Ich möchte einfach nur per Hand nun die Update Methode ändern, damit diese funktioniert ... nur wie ??
-
...
-
Ich mein das doch nicht Böse. Nicht so ernst sehen.
Aber ich frag mich immernoch wofür @Name z.B. steht. Wir haben im Kurs mit SQL Server diese Syntax genommen wie z.B.
SELECT Kontakte.* from Kontakte where atid=@kdnr
Nur was ist @ und woher kriegt man das steht das für die Textbox->name kdnr? also das der den Inhalt davon bezieht oder muss @ extra Deklariert werden (vereinbart werden).
-
[flame]
Du Fummelst einfach irgendwo rum und regst Dich dann auf wenn es nicht mehr klappt. Sagt man Dir dann, Du sollst einfach mal durch den Assistent das Statement wieder herstellen lassen, erhält man nur ein "scheinst keine Ahnung zu haben" und "ich will doch einfach nur im SQL Statement rumpfuschen" zurück. (Freie Interpretation).
[/flame]Ich weiß nicht genau wo jetzt Deine Zielsetzung ist oder was Du da jetzt versuchst. Du sitzt vor dem Statement und überlegst, wie da jetzt der Wert von Textbox1 rein kommen soll. An einer Stelle, an der Textbox1 rein garnichts mehr mit dem Statement zu tun hat.
Die Daten werden durch das BindingSource etc. in das DateSet geschrieben. Der UpdateCommand kann mittels den @Name bzw. ? geschichten diese Werte auslesen und setzt damit das angegebene Statement um. Zu dem Statement gehören noch Parameter
Beachte:
Die Syntax für Parameterplatzhalter ist je nach Datenquelle unterschiedlich. Dieses Beispiel zeigt Platzhalter für eine SQL Server-Datenquelle. Verwenden Sie Fragezeichenplatzhalter (?) für System.Data.OleDb-Parameter und System.Data.Odbc-Parameter.
Keiner der hier mitlesenden weiß, was Du in dem Statement rumgefriemelt hast. Der Zustand ist undefiniert. Das einfachste wäre, Du erstellst das Statement noch einmal neu mit dem Wizzard, dann hat man mal einen definierbaren Ausgangszustand.
Schau mal hier, da gibt es einiges an Infos zu dem Thema:
http://msdn2.microsoft.com/de-de/library/bbw6zyha(VS.80).aspx
-
Da muss ich Knuddlbear recht geben.
Warum machst Du Dir das so unnötig schwer.Guckst Du hier...
http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpref/html/frlrfsystemdataidataadapterclassupdatetopic.aspWarum willst Du Dir jetzt noch SQL um die Ohren hauen?
BindingSource macht das alles für Dich.
Und wenn es mal klemmt, bekommst Du eine satte Fehlermeldung auf die Du reagieren kannst.
Das @ bezeichnet allerdings eine Variable in SQL.
-
Und was sollte ich eurer Meinung nach machen?
DataSet neu generieren durch Assitenten ?
-
Als erstes den Adapter neu Konfigurieren. (Ich glaub der Menüpunkt heisst sogar Konfigurieren). Das DataSet musst Du nur neu erstellen, wenn Du da auch die Finger drinn hattest, damit das ganze zusammenpasst.
-
Du kannst den BindingSource auch manuell einbinden.
Toolbox unter Daten.
Dann Verbinde die Eigenschaft "DataSource" mit "dataSet1".Aber das beste wäre, alles nochmal neu in die Form zuziehen.
Schneide die Eingabefelder am besten vorher aus.
Wenn Du die Eingabefelder so in die Form ziehst, werden die mit Nummern neu gekennzeichnet (Anrede = Anrede1 usw.).
Lösche dann alle Steuerelement, dass Du nur noch die blanke Form da hast.
Denk aber daran, dass Du noch die Eingabefelder in der Zwischenablage hast.
Zieh dann die neuen Elemente aus dem Datenquellen-Fenster in die nackte Form.
Danach löscht Du die neuen Eingabefelder (nicht Ausschneiden), damit überschreibst Du die alten Element in der Zwischenablage, einfach markieren und Del oder Entf drücken.
Danach fügst Du die Elemente aus der Zwischenablage wieder ein.
Damit ersparst Du Dir das Aussichten und Gradeziehen der Eingabefelder.Und dann hör auf mit dem rumgefriemel...