PDA

Vollständige Version anzeigen : AddNew Methode beim DataEnvironment


Silenoz
20.06.2001, 14:50
Hi,
ok, da es anscheinende keine Beispiele für den DE gibt, werde ich dann mal spezifischer. Also mein größtes Problem ist eigentlich im Moment, dass wenn ich die AddNew Methode des DataEnvironments verwende kommt die Fehlermeldung "Die von der Anwendung angeforderte Operation, wird vom Provider nicht unterstützt." Ich verwende Microsoft.Jet.OLEDB.3.51.

Aber genau den benutze ich auch wenn ich ne Datenbank nur mit ADO ansteuere und da stellt die AddNew Methode kein Problem da.

Bitte dringend um Hilfe.

Gruß Oli

Stefan Kulpa
21.06.2001, 05:52
<font face="Verdana" size="2">Hallo,

falls Du auf Access 2000 Datenbanken zugreifst, benötigst Du den Jet 4.0 Provider, etwa wie folgt:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Meine.mdb;Persist Security Info=False

wobei der Provider für die Connection und nicht für das DataEnvironment bestimmt ist.
Wie auch immer vermeide ich es, in den RecordSets mit AddNew etc. zu arbeiten, sondern
erstelle mir die entsprechenden Aktionen als Commands. Dabei nehme ich Access als Grundlage
für den SQL-Syntax und füge diesen etwas modifiziert in die Commands ein - z.B.:

Neuen Datensatz anlegen:
<font color="#0000FF">cmdAddRecord</font>: </font><font face="Courier New" size="2">INSERT INTO tblMyTable(Feld1, Feld2, Feld3, Feld4, Feld5) VALUES (?,?,?,?,?)
</font>
<font face="Verdana" size="2">Datensatz aktualisieren:
<font color="#0000FF">cmdUpdateRecord</font>:</font> <font face="Courier New" size="2">UPDATE tblMyTable SET Feld1 = ?,Feld2 = ?,Feld3 = ?,Feld4 = ?,Feld5 = ? WHERE (lRecID = ?)</font>

<font face="Verdana" size="2">Datensatz löschen:
<font color="#0000FF">cmdDeleteRecord</font>:</font> <font face="Courier New" size="2">DELETE FROM tblMyTable WHERE lRecID=?
</font>

<font face="Verdana" size="2">Die Fragezeichen stehen für Parameter, die später entsprechend gefüllt werden müssen:</font>
<PRE><FONT SIZE=1 FACE=Courier New><FONT COLOR=#008000>'** Neuanlage</FONT>
objDataEnv.cmdAddRecord _
<FONT COLOR=#000080>CLng</FONT>(0 & Feld1.Text), _
<FONT COLOR=#000080>CStr</FONT>("" & Feld2.Text), _
<FONT COLOR=#000080>CStr</FONT>("" & Feld3.Text), _
<FONT COLOR=#000080>CLng</FONT>(0 & Feld4.Text), _
<FONT COLOR=#000080>CLng</FONT>(0 & Feld5.Text)

<FONT COLOR=#008000>'** Aktualisierung</FONT>
objDataEnv.cmdUpdateRecord _
<FONT COLOR=#000080>CLng</FONT>(0 & Feld1.Text), _
<FONT COLOR=#000080>CStr</FONT>("" & Feld2.Text), _
<FONT COLOR=#000080>CStr</FONT>("" & Feld3.Text), _
<FONT COLOR=#000080>CLng</FONT>(0 & Feld4.Text), _
<FONT COLOR=#000080>CLng</FONT>(0 & Feld5.Text), _
<FONT COLOR=#000080>CLng</FONT>(lRecID) <FONT COLOR=#008000>'** ID des Datensatzes</FONT>

<FONT COLOR=#008000>'** Löschen</FONT>
objDataEnv.cmdDeleteRecord lRecID

</FONT></PRE>

<font face="Verdana" size="2">HTH</font>

Silenoz
21.06.2001, 11:53
Hey thx, ich werds dann mal ausprobieren (mal gespannt ob ich das vestanden habe ;)

Gruß Oli

Silenoz
21.06.2001, 16:51
Hi Stefan,
also erstmal danke für die Hilfe. Habs ausprobiert (obwohl SQL eigentlich nie so richtig mein Ding war).

Wenn ich nun aber das enstprechende Command (cmdAddRecord) ansprechen will, gibt er mir folgende Fehlermeldung zurück: "Syntaxfehler in der INSERT INTO-Anweisung" und bezieht sich dabei auf folgende
Programmzeile:

DE.cmdAddRecord CStr("" & txtDatenfeld(0).Text), CStr("" & txtDatenfeld(1).Text), CStr("" & txtDatenfeld(2).Text), CStr("" & txtDatenfeld(3).Text), CStr("" & txtDatenfeld(4).Text), CStr("" & txtDatenfeld(5).Text), CStr("" & txtDatenfeld(6).Text), CStr("" & txtDatenfeld(7).Text), CStr("" & txtDatenfeld(8).Text), CStr("" & txtDatenfeld(9).Text)

Ich habe die Eingabefelder aus Programmiertechnischen Gründen als Arrays vorliegen.

Wo is der Fehler und warum kann ich eigentlich die AddNew Methode nicht verwenden?

Gruß Oli

Stefan Kulpa
22.06.2001, 07:42
<font face="Verdana" size="2">Hallo Oli,

der Befehl sieht in Ordnung aus.
Wie sieht denn der SQL-Befehl des Commands aus?
Er moniert ja nicht den ausgeführten Befehl, sondern den SQL-Syntax.
Du benötigst 9 Feldnamen und 9 Fragezeichen.</font>

<font face="Courier New" size="2">INSERT INTO tblMyTable(Feld1, ..., Feld9) VALUES (?,?,?,?,?,?,?,?,?)</font>

<font face="Verdana" size="2">Achte auch auf die Reihenfolge - so wie Du die Daten übergibst,
werden die Fragezeichen "ersetzt". Sind alle Felder vom Typ Text?

Gehe in den Eigenschaftsdialog des Command-Objekt und wechsle
auf die Registerkarte Parameter. Vergib für jeden Parameter einen
Namen und stelle sicher, dass foldende Einstellungen vorliegen:
Richtung: <font color="#008000">Eingabe</font>
Datentyp: <font color="#008000">adVarWChar</font>
Hostdatentyp: <font color="#008000">String (VT_BSTR)</font>

Den AddNew-Befehl kannst Du natürlich benutzen, allerdings nur mit ganz speziellen Einstellungen.
Auszug aus der OL:
<hr>
Syntax

Recordset.AddNew FieldList, Values

Parameter
FieldList Optional. Ein einzelner Name oder ein Array mit Namen oder Ordinalpositionen der Felder in dem neuen Datensatz.

Values Optional. Ein einzelner Wert oder ein Array mit Werten für die Felder in dem neuen Datensatz. Wenn Fields ein Array ist, muss Values ebenfalls ein Array (mit der gleichen Anzahl an Elementen) sein; andernfalls tritt ein Fehler auf. Die Reihenfolge der Feldnamen muss der Reihenfolge der Feldwerte in jedem Array entsprechen.

Hinweise

Verwenden Sie die AddNew-Methode, um einen neuen Datensatz zu erstellen und zu initialisieren. Verwenden Sie die Supports <mdmthsupports.htm>-Methode zusammen mit adAddNew, um zu überprüfen, ob Sie Datensätze zum aktuellen Recordset-Objekt hinzufügen können.

Nachdem Sie die AddNew-Methode aufgerufen haben, wird der neue Datensatz zum aktuellen Datensatz und bleibt aktuell, nachdem Sie die Update <mdmthupdate.htm>-Methode aufgerufen haben. Wenn das Recordset-Objekt Lesezeichen nicht unterstützt, ist der Zugriff auf den neuen Datensatz eventuell nicht möglich, sobald zu einem anderen Datensatz gewechselt wurde. Abhängig vom verwendeten Cursortyp ist unter Umständen ein Aufruf der Requery <mdmthadorequery.htm>-Methode erforderlich, um einen Zugriff auf den neuen Datensatz zu ermöglichen.

Wenn Sie AddNew aufrufen, während Sie den aktuellen Datensatz bearbeiten oder einen neuen Datensatz hinzufügen, ruft ADO die Update-Methode auf, um alle Änderungen zu speichern, und erstellt dann den neuen Datensatz.

Das Verhalten der AddNew-Methode hängt vom Aktualisierungsmodus des Recordset-Objekts ab und davon, ob Sie die Fields- und Values-Argumente übergeben haben.

Wenn der Provider Änderungen sofort in die zugrunde liegende Datenquelle schreibt, sobald Sie die Update-Methode aufrufen, setzt das Aufrufen der AddNew-Methode ohne Argumente die EditMode <mdproeditmode.htm>-Eigenschaft auf adEditAdd. Der Provider speichert alle Feldwertänderungen lokal im Zwischenspeicher. Das Aufrufen der Update-Methode überträgt den neuen Datensatz in die Datenbank und setzt die EditMode-Eigenschaft auf adEditNone zurück. Wenn Sie die Fields- und Values-Argumente übergeben, überträgt ADO den neuen Datensatz sofort in die Datenbank (ein Aufruf von Update ist nicht erforderlich); der EditMode-Eigenschaftswert ändert sich dabei nicht (adEditNone).

Im Stapelaktualisierungsmodus (der Provider speichert mehrere Änderungen im Zwischenspeicher und schreibt sie nur dann in die zugrunde liegende Datenquelle, wenn Sie die UpdateBatch <mdmthupdatebatch.htm>-Methode aufrufen) setzt das Aufrufen der AddNew-Methode ohne Argumente die EditMode-Eigenschaft auf adEditAdd. Der Provider speichert alle Feldwertänderungen lokal im Zwischenspeicher. Das Aufrufen der Update-Methode fügt den neuen Datensatz zum aktuellen Recordset hinzu und setzt die EditMode-Eigenschaft auf adEditNone zurück. Der Provider überträgt die Änderungen zu der zugrunde liegenden Datenbank jedoch erst dann, wenn Sie die UpdateBatch-Methode aufrufen. Wenn Sie die Fields- und Values-Argumente übergeben, übergibt ADO den neuen Datensatz an den Provider zum Speichern in einem Zwischenspeicher. Sie müssen die UpdateBatch-Methode aufrufen, um den neuen Datensatz an die zugrunde liegende Datenbank zu übergeben.

Wenn die dynamische Eigenschaft Unique Table <mdprodynuniquetable.htm> eingestellt ist und das Recordset-Objekt das Ergebnis eines ausgeführten Verbundvorgangs auf mehreren Tabellen ist, können durch die AddNew-Methode nur Felder in die Tabelle eingefügt werden, die in der Eigenschaft Unique Table genannt ist.
<hr>
Alternativ kanst du ja auch das ADO-Data-Control benutzen, dann läuft die gesamte Geschichte datengebunden ...

Gruß</font>

Silenoz
23.06.2001, 12:10
Hi Stefan,
also erstmal bin ich dir echt oberst dankbar, dass du dir soviel Mühe mit mir gibst...

Nun ich hatte den Datentyp falsch gesetzt gehabt, den Hostdatentyp, hatte ich irgendwie intuitiv richtig *g*

Aber nachdem ich diesen Fehler korrigiert habe und die Anzahl der Fragezeichen und Felder überprüft habe (die Anzahl stimmte), kam auch schon der nächste Fehler (wie solls auch anders sein *heul*)...

Da sagt er mir, wieder mit Bezug auf die Befehlszeile:

Anwendungs- oder Objektdefinierter Fehler

Das ist echt zum verzweifeln und das mit der AddNew Methode bekomme ich auch net gebacken, ich bin da irgendwie zu blöd für (desshalb glaube ich wäre mir mit nem Beispiel am besten geholfen)!!!

Ich will halt unbedingt den DE verwenden, weil ich an den direkt den Data Report Designer anbinden kann.

Sorry, für meine Fragerei und danke nochmal für die Mühe.

Gruß Oli

Stefan Kulpa
23.06.2001, 14:38
<font face="Verdana" size="2">Hallo Oli,

also was den "Anwendungs- oder Objektdefinierter Fehler"-Fehler angeht - ohne Bezug auf die entsprechende Code-Stelle kann man da nichts zu sagen. Wie sieht's mit einem Error-Handling aus? Dann kann man mittels F5/F8 etc. bis zur entsprechende Stelle "steppen".
Beispiele zum Download kenne ich nicht - das ist aber auch etwas schwierig, da hier so viele Komponenten zusammen kommen, die alle "stimmen" müssen. Vielleicht wäre hier die Suche nach einem passenden Buch angebracht ... allerdings glaube ich nicht, dass sich ein Buch ausschließlich mit dem DataEnvironment beschäftigt. Generell sind folgende Werke nicht ganz uninteressant:

Datenbankprogrammierung mit Visual Basic 6.0
Walter Doberenz/Thomas Kowalski
Microsoft Press
ISBN 3-86063-485-2
DM 79,00

bzw.

Visual Studio Dokumentation
Microsoft Visual Basic 6.0
Datenzugriffshandbuch
Microsoft Press
ISBN 3-86063-060-1
DM 79,00

HTH</font>

Silenoz
23.06.2001, 17:03
Hmmm... ok thx, das klingt ganz gut, da werde ich mich mal drum kümmern.

Gruß Oli