AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken TADOCommand mit Parametern - PK-Verletzung
Thema durchsuchen
Ansicht
Themen-Optionen

TADOCommand mit Parametern - PK-Verletzung

Ein Thema von hyype · begonnen am 12. Jun 2012 · letzter Beitrag vom 13. Jun 2012
Antwort Antwort
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#1

AW: TADOCommand mit Parametern - PK-Verletzung

  Alt 12. Jun 2012, 15:46
toll, jetzt habe ich im insert auch mal @ID statt :IID verwendet und setzen tu ich wie folgt:
SET @ID = CONVERT(INT,:WID);
Der Parameter WID hat den Wert 1699, inserten tut er mir aber den Wert -1, wie geht das denn?

ele, da du das offenbar shconmal zum laufen gekriegt hast, die frage an dich: was mache ich falsch? ich hab's eigentlich genau so gemacht wie du

Geändert von hyype (12. Jun 2012 um 15:53 Uhr)
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#2

AW: TADOCommand mit Parametern - PK-Verletzung

  Alt 12. Jun 2012, 15:59
Hi,

erstelle eine StoredProc in der Datenbank, der du alle zu speichernden Werte als Parameter übergibst. In der Proc kannst du dann so ähnlich wie bisher zuerst update und ggf. insert ausführen.

In Delphi hast du dann nur einmal die Parameter - alle Logik liegt in der Datenbank.
Gruß
Norman
  Mit Zitat antworten Zitat
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#3

AW: TADOCommand mit Parametern - PK-Verletzung

  Alt 12. Jun 2012, 16:07
Das Problem ist, dass ich das sehr allgemein programmiere, um es für jede Tabelle zu benutzen.
Die spezifischen Tabellen haben dann unterschiedliche Anzahl an Spalten, unterschiedliche Datentypen etc
Da ich die alle machen, kann ich nur sagen, dass die von mir als PK gekennzeichneten Spalten integer sind.
Über den Rest ist mir auf der Ebene nix bekannt, daher weise ich die Werte als Variant zu, also

var value : variant;
...
value := 1699;
...
params[i].value := value;

und:

Delphi-Quellcode:

  q := tadodataset.create(nil);
  try
    q.connectionstring := ...
    q.CommandType := cmdText;
    q.commandtext := 'DECLARE @BLUB INT; SET @BLUB = :BLUB; SELECT @BLUB AS BLUB;';
    q.Parameters.parambyname('BLUB').value := 1699;
    q.Open;
    showmessage(inttostr(q.fieldbyname('blub').asinteger));
  finally
    freeandnil(q);
  end;
das geht komischerweise, ja bin ich denn blöd?
  Mit Zitat antworten Zitat
Peinhard

Registriert seit: 8. Jul 2006
152 Beiträge
 
#4

AW: TADOCommand mit Parametern - PK-Verletzung

  Alt 13. Jun 2012, 07:03
Params[i]...? Oder meintest du Parameters[i]? Und hast du mal mit property ParamCheck gespielt?
Confuzius say: Early worm have death wish.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: TADOCommand mit Parametern - PK-Verletzung

  Alt 13. Jun 2012, 07:30
Wenn Du die Tabellen kennst, und weißt, für welche Spalten Du Parameter verwendest, dann kannst Du dein Skript so zusammenbauen, das der Datentyp korrekt wiedergegeben wird.

Beim Skript kannst Du dir vielleicht mit dem Datentyp SQL_VARIANT behelfen.

Auf jeden Fall sollte den Parametern der jeweils richtige Datentyp zugewiesen werden.

Beim dynamischen Zusammenbasteln von Skripten verwende ich keine Parameter, sondern eigene Formatierungsroutinen, die natürlich das Injection-Problem behandeln.

Dessenungeachtet würde ich mir überlegen, die Transaktion vom TADOConnection-Objekt erledigen zu lassen. Erzeuge einfach eine Exception (RAISEERROR), wenn Du in deinem Skript das Rollback forcieren willst.
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#6

AW: TADOCommand mit Parametern - PK-Verletzung

  Alt 13. Jun 2012, 08:36
Kann man das denn nicht mit mehreren Querys hintereinander erledigen, so nach dem Motto
Das ist so ziemlich die langsamste Lösung, vor allen Dingen mit 'SELECT COUNT(*)'.
Das mit dem Skript ist schon ein guter Ansatz. Wenn er Fragesteller das dynamisch für beliebige Tabellen machen will, kommt man aber mit dem SP-Ansatz nicht weiter, hier hilft dann wirklich nur ein ordentlich zusammengebautes Skript, eben mit Angabe des Datentyps.
  Mit Zitat antworten Zitat
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#7

AW: TADOCommand mit Parametern - PK-Verletzung

  Alt 13. Jun 2012, 09:52
auch wenn ich den datentyp explizit setze, ftInteger oder ftWord, funktioniert es nicht
der parser setzt den parameter offenbar nicht ein, beim convert(int,:wid) erhalte ich eine -1
denkt ihr, dass ich es irgendwie so umbauen kann , dass es funktioniert,
oder muss ich mich von meiner variante verabschieden und es tatsächlich auf mehrere statements aufteilen?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: TADOCommand mit Parametern - PK-Verletzung

  Alt 13. Jun 2012, 07:54
Es wurde ja schon gesagt, dass man jeden Parameter nur einmal benützen darf.
Aber zusätzlich ergibt sich noch folgendes Problem:
Die VCL versucht den CommandText zur Entwicklungszeit zu parsen um die Datentypen und Datenrichtung der Parameter zu ermitteln.
Bei einfachen oder "normalen" SQL-Abfragen klappt das auch recht gut.
Delphi-Quellcode:
// Beispiel
CommandText := 'SELECT * FROM Tabelle WHERE Status=:Param1';
Die VCL öffnet die Datenbank im Hintergrund und fragt die Felder der Tabelle ab.
Der Parameter Param1 bekommt dann den Datentyp (ggf. auch Länge oder Anz. Nachkommstellen) des Feldes Status verpasst.
Ausserdem erkennt der Parser, dass es sich um einen Input-Parameter handelt.

Bei SQL-Anweisungen mit mehr als einem Befehl (getrennt durch Strichpunkt) funktioniert der Parser nicht mehr so richtig.
Der Parser erkennt noch die Namen der Parameter aber der Datentyp ist Unknown.
Und deshalb funktioniert dann auch die Wertübergabe der Parameter nicht.

Eine Stored Proc, wie von NormanG vorgeschlagen, würde dem Parser wieder ermöglichen die Datentypen & Richtungen zu ermitteln.

Man kann aber auch die ADODataset-Komponenten schon zur Entwicklungszeit erstellen und mit dem Objektinspektor die Datentypen der Parameter festlegen.
Oder man legt die Datentypen später per Code fest.
Auf jeden Fall bewegt man sich in schwierigem Gelände wenn man ganze SQL-Scripts per Parameter versorgen möchte.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#9

AW: TADOCommand mit Parametern - PK-Verletzung

  Alt 13. Jun 2012, 08:29
Kann man das denn nicht mit mehreren Querys hintereinander erledigen, so nach dem Motto:

if exists then update else insert;

wobei exists schaut, ob's den PK schon gibt ('Select count(*) where PK = :MyPK'), und update und insert halt entsprechende SQL-Statements abschicken.
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 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-2025 by Thomas Breitkreuz