Einzelnen Beitrag anzeigen

Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#2

Re: ADO.NET-Insert funktioniert nicht

  Alt 12. Sep 2007, 16:00
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat