Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism ADO.NET-Insert funktioniert nicht (https://www.delphipraxis.net/99457-ado-net-insert-funktioniert-nicht.html)

fly_singapore 12. Sep 2007 14:54

Datenbank: MS SQL 2002 • Zugriff über: ADO.NET

ADO.NET-Insert funktioniert nicht
 
Hilfeeeeeeeeeeeeeeeee!

Ich habe ein grosses Problem mit dem Anfügen und schreiben von Datensätzen in meiner MS SQL -Datenbank.
Obwohl ich weder Syntax- noch Laufzeitfehler über den Webbrowser zurückbekomme, die Anwendung ohne Fehleranzeige abläuft,
werden keine Datensätze in die Tabelle geschrieben.. Woran könnte das liegen. Hierz habe ich das Script mitgebracht.


Delphi-Quellcode:
procedure TWebForm1.Button1_Click(sender: System.Object; e: System.EventArgs);

var
       Connect   : OLEDBConnection;
       ds        : Dataset;
       cSQL      : string;
       da        : OleDBDataAdapter;
       InsCmd   : OleDBCommand;

begin
       // Connection
       connect := OleDBConnection.Create('Provider=SQLOLEDB;Data Source=163.123.31.128;Initial Catalog=migration; User ID=Steffens;password=test');
       cSQL :=  'INSERT INTO testtabelle (Name) VALUES (' + quotedstr('Peter') +')';

       try

       connect.Open ;

       da := OleDBDataAdapter.Create;

       insCMD := OleDBCommand.create(cSQL, connect);
       da.InsertCommand := insCMD;

       connect.Close;


       label1.text := 'Alles in Ordnung';



       except
          on ex: exception do
             label1.text := ex.Message;

       end;


end;

end.
Ausführen lasse ich dieses kleine Testanwendung über einen IE-Webbrowser.

Jürgen Thomas 12. Sep 2007 16:00

Re: ADO.NET-Insert funktioniert nicht
 
Zitat:

Zitat von fly_singapore
Delphi-Quellcode:
       connect.Open ;

       da := OleDBDataAdapter.Create;

       insCMD := OleDBCommand.create(cSQL, connect);
       da.InsertCommand := insCMD;
       //  hier fehlt die Ausführung des Command

       connect.Close;

Hauptfehler: Es fehlt die Anweisung, dass der DbCommand überhaupt auszuführen ist. Beim Ausführen über den DbDataAdapter ist dazu DbDataAdapter.Update() vorgesehen; aber es geht auch direkt (ohne da) über insCMD.ExecuteNonQuery().

Zusätzliche Gesichtspunkte: Für den MS-SQL Server sind die Sql-Klassen vorgesehen (nicht OleDb). Der DbDataAdapter öffnet und schließt die Verbindung automatisch; auf connect.Open/Close kann meistens verzichtet werden. Der DbCommand-String soll niemals (NIEMALS!) als langer String erstellt werden, sondern die Werte sind per DbParameter hinzuzufügen:
Delphi-Quellcode:
     cSQL :=  'INSERT INTO testtabelle (Name) VALUES (?)';
     insCMD := OleDBCommand.create(cSQL, connect);
     insCMD.Parameters.Add('Vorname', SqlDbType.String).Value = 'Peter';
Wie die Parameter im Befehlstext einzutragen sind, weiß ich nicht, das ist bei jedem DbProvider anders: mit oder ohne Parameter-Bezeichnung, mit '?' oder '@' oder ':' usw. Aber das hat nur Vorteile: Der DbProvider steuert QuotedStr selbst, regelt notwendige Konvertierungen und vermeidet überflüssige, und SQL-Injection wird verhindert.

Gruß Jürgen

Phoenix 12. Sep 2007 16:13

Re: ADO.NET-Insert funktioniert nicht
 
Zitat:

Zitat von Jürgen Thomas
Zusätzliche Gesichtspunkte: Für den MS-SQL Server sind die Sql-Klassen vorgesehen (nicht OleDb).

Dazu noch als Ergänzung: Idealerweise verwendet man allerdings nur die Interfaces, damit man bei Bedarf die Datenbankschicht ohne weiteres austauschen kann.

fly_singapore 12. Sep 2007 16:23

Re: ADO.NET-Insert funktioniert nicht
 
Hallo Jürgen Thomas,


Die Methode 'insCMD.ExecuteNonQuery()' hat mir schon sehr gut weitergeholfen . :bounce2: So klappt es auch mit dem Einfügen.
Mit der Parametrisierung muss ich mir noch richtig reinziehen.

Ich danke Dir recht herzlich !!!!

PS: Ursprünglich hatte ich das auch mit SQLCommand ausprobiert. Nur dachte ich, es würde daran liegen. Ich habe stattdessen die OLEB-Variante ausprobiert...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr.

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