Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism ADO.NET Update auf MS Access DB (https://www.delphipraxis.net/47377-ado-net-update-auf-ms-access-db.html)

sakura 10. Jun 2005 09:23

Datenbank: MS Access • Version: 2002 • Zugriff über: ADO.NET OleDB

ADO.NET Update auf MS Access DB
 
Hi,

irgendwie scheitere ich gerade an den einfachsten Dingen der Welt :roll:

Ersteres Statement wird ohne Probleme ausgeführt. Hierbei ist der neue Wert des Feldes Artikel fest codiert in die SQL-Query eingefügt.
Delphi-Quellcode:
var
  Ad: OleDbDataAdapter;
...
  Ad := OleDbDataAdapter.Create;
  Ad.UpdateCommand := OleDbCommand.Create('UPDATE Auftragsdetails SET Artikel = "neu" WHERE ID = ?', FConnection);
  Ad.UpdateCommand.Parameters.Add('ID', TObject(1));
  Ad.UpdateCommand.ExecuteNonQuery;
Möchte ich diesen nun parametrisieren und später setzen, wie im folgenden Beispiel, dann wird die Query ohne Fehlermeldungen ausgeführt, allerdings wird der entsprechende Datensatz nicht geändert. :shock:
Delphi-Quellcode:
var
  Ad: OleDbDataAdapter;
...
  Ad := OleDbDataAdapter.Create;
  Ad.UpdateCommand := OleDbCommand.Create('UPDATE Auftragsdetails SET Artikel = ? WHERE ID = ?', FConnection);
  Ad.UpdateCommand.Parameters.Add('ID', TObject(1));
  Ad.UpdateCommand.Parameters.Add('Artikel', 'neu');
  Ad.UpdateCommand.ExecuteNonQuery;
FConnection ist eine gültige und aktive Verbindung (OleDbConnection) zu MS Access DB.

...:cat:...

P.S.: Artikel ist ein Felb vom Typ Text mit einer Größe von 50 Zeichen.

Phoenix 10. Jun 2005 09:36

Re: ADO.NET Update auf MS Access DB
 
Probiers mal mit:
Delphi-Quellcode:
Ad.UpdateCommand := OleDbCommand.Create('UPDATE Auftragsdetails SET Artikel = "?" WHERE ID = ?', FConnection);
// bzw.
Ad.UpdateCommand.Parameters.Add('Artikel', '"neu"');
Wobei das eigentlich nicht stören dürfte. Ab und zu verschluckt sich JET an sowas aber mal.

sakura 10. Jun 2005 09:42

Re: ADO.NET Update auf MS Access DB
 
Zitat:

Zitat von Phoenix
Wobei das eigentlich nicht stören dürfte. Ab und zu verschluckt sich JET an sowas aber mal.

Nope, das macht leider keinen Unterschied. :cry:

...:cat:...

Robert_G 10. Jun 2005 10:21

Re: ADO.NET Update auf MS Access DB
 
OleDB unterstützt doch benannte Parameter.
Dein Statement könnte also theorethisch so aussehen:

Delphi-Quellcode:
procedure TXXX.UpdateArticle(aConnection :IdbConneciton; aArticle :TArticle);
var
  Command    :IDbCommand;
  Article, ID :IDataParameter;
begin
  Command := aConnection.CreateComamnd();
  Command.CommandText := 'UPDATE Auftragsdetails SET Artikel = :Article WHERE ID = :ID';

  Article := Command.CreateParameter();
  ID := Command.CreateParameter();

  Article.ParameterName := 'Article';
  Article.Value := aArticle.Name;

  ID.ParameterName := 'ID';
  ID.Value := aArticle.Id;

  Command.Parameters.Add(Article);
  Command.Parameters.Add(ID);

  Command.ExecuteNonQuery();
end;

sakura 10. Jun 2005 11:00

Re: ADO.NET Update auf MS Access DB
 
Okay, das geht. Danke.

Nun aber noch die Frage, warum es nicht so geht, das war mein ursprünglicher Ansatz :?
Delphi-Quellcode:
var
  Ad: OleDbDataAdapter;
...
  Ad.UpdateCommand := OleDbCommand.Create('UPDATE Auftragsdetails SET Artikel = :Artikel WHERE ID = :ID', FConnection);
  Ad.UpdateCommand.Parameters.Add('ID', TObject(1));
  Ad.UpdateCommand.Parameters.Add('Artikel', txtArtikel.Text);
  Ad.UpdateCommand.ExecuteNonQuery;
...:cat:...

nieurig 10. Jun 2005 11:27

Re: ADO.NET Update auf MS Access DB
 
Hallo Sakura,
ich denke, wenn unbenannte Parameter verwendet werden, dann darf man auch keinen Namen angeben. Dann greift man wohl über eine Nummer auf die Parameter zu.

Code:
Ad.UpdateCommand.Parameters.Add('ID', TObject(1));
Hier dürfte ID das Problem sein...

Niels

sakura 10. Jun 2005 13:20

Re: ADO.NET Update auf MS Access DB
 
Zitat:

Zitat von nieurig
Hallo Sakura,
ich denke, wenn unbenannte Parameter verwendet werden, dann darf man auch keinen Namen angeben. Dann greift man wohl über eine Nummer auf die Parameter zu.

Doch die ID geht ohne Probleme, siehe erster Test. Wie dem auch sei, selbst wenn ich es wie folgend schreibe, geht es nicht, obwohl es doch eigentlich das Gleiche sein sollte :?
Delphi-Quellcode:
var
  Ad: OleDbDataAdapter;
...
  Ad.UpdateCommand := OleDbCommand.Create('UPDATE Auftragsdetails SET Artikel = :Artikel WHERE ID = :ID', FConnection);
  Ad.UpdateCommand.Parameters.Add('ID', TObject(1));
  Ad.UpdateCommand.Parameters.Add('Artikel', txtArtikel.Text);
  Ad.UpdateCommand.ExecuteNonQuery;
...:cat:...

Robert_G 10. Jun 2005 13:46

Re: ADO.NET Update auf MS Access DB
 
Was willst du denn da ständig mit dem DataAdapter? :gruebel:
Wenn du DataSets nutzen willst, dann lasse dir einfach ein typed DataSet für deine Tabellen erzeugen.
Wenn du es richtig machen willst reicht dir doch ein Command. irgendwie verstehe ich gerade nicht ganz, was da in den
Delphi-Quellcode:
...
vor sich geht.
Denn entweder du hast ein DataSet und benutzt DataAdapter.Fill(DeinDataset) oder du hast keine DataSets und kannst daraufhin alle DAs entsorgen... :gruebel:

sakura 10. Jun 2005 14:40

Re: ADO.NET Update auf MS Access DB
 
Zitat:

Zitat von Robert_G
Was willst du denn da ständig mit dem DataAdapter? :gruebel:

Okay, dann mal ohne. Es geht ja auch nicht um den, sondern um die Erstellung/Belegung der Parameter. Warum geht das nicht wie folgend?
Delphi-Quellcode:
var
  Cmd: OleDbCommand;
begin
  Cmd := FConnection.CreateCommand;
  Cmd.CommandText := 'UPDATE Auftragsdetails SET Artikel = :Artikel WHERE ID = :ID';
  Cmd.Parameters.Add('ID', TObject(1));
  Cmd.Parameters.Add('Artikel', txtArtikel.Text);
  Cmd.ExecuteNonQuery;
end;
Ich hätte gedacht, dass das vom Sinn her gleich wäre.

...:cat:...

Robert_G 10. Jun 2005 14:55

Re: ADO.NET Update auf MS Access DB
 
Zitat:

Zitat von sakura
Ich hätte gedacht, dass das vom Sinn her gleich wäre.

Der OleDb Provider ist zusammen mit dem ODBC sozusagen das Provider Museum in .Net.
Sei dankbar, dass es über die Interfaces geht. Alles weitere würde eine brauchbare DB mit einem brauchbaren Provider erfordern. :mrgreen:

Ist IMHO sowieso die einzig sinnvolle Art es zu machen. ;)
Ändere deine DB zum Bleistift auf FireBird, Oracle,... , werfe oben eine Instanz der passenden Connection rein und es wird laufen. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz