Autor |
Beitrag |
JRegier
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Do 09.06.05 09:54
Hallo, ich will dass meine Anwendung auf verschiedene DB'S zugreift!
Also z.B. jetzt MySQL mit Schlüssel wie TINYINT oder SMALLINT oder MEDIUMINT oder INT oder BIGINT
Wie sollte SQL Befehl aussehen wenn Schlüsseltyp unbekannt?
Delphi-Quelltext 1: 2:
| DataSet.SQL.Add('SELECT * FROM table WHERE id = :id'); DataSet.ParamByName('id').AsInteger := Value; |
oder
Delphi-Quelltext 1:
| DataSet.SQL.Add('SELECT * FROM table WHERE id = '+IntToStr(Value)); |
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Do 09.06.05 11:30
die paramter-property value solltest du benutzen. die ist vom typ variant und da kannst du reinschreiben, was auch immer du willst.
Delphi-Quelltext 1:
| DataSet.ParamByName('id').Value := MyValue; |
viele grüße
alex
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Do 09.06.05 22:32
iKilledKenny hat folgendes geschrieben: | die paramter-property value solltest du benutzen. die ist vom typ variant und da kannst du reinschreiben, was auch immer du willst.
Delphi-Quelltext 1:
| DataSet.ParamByName('id').Value := MyValue; |
viele grüße
alex |
Vielen Dank für die Aufschlußreiche Information! Aber was ist eigentlich mit der 2. Möglichkeit
also reines SQL+IntToStr(KeyValue) mache?
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Fr 10.06.05 11:49
das sollte in diesem fall (int, bigint...) genauso funktionieren. die geschichte mit dem .Value geht für alle typen und ist daher universeller. bei strings z.b. müsstest du mit deiner methode auf ein QuotedStr achten (-> fehlerträchtig).
außerdem speichert dbms (z.b. oracle) sql-statements in einem cache, so dass parametrisierte abfragen schneller verfügbar sind.
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Fr 10.06.05 19:16
iKilledKenny hat folgendes geschrieben: | das sollte in diesem fall (int, bigint...) genauso funktionieren. die geschichte mit dem .Value geht für alle typen und ist daher universeller. bei strings z.b. müsstest du mit deiner methode auf ein QuotedStr achten (-> fehlerträchtig).
außerdem speichert dbms (z.b. oracle) sql-statements in einem cache, so dass parametrisierte abfragen schneller verfügbar sind. |
Habe es Ausprobiert!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TDBAdminInterface.Operation(DataSet : TDataset; Operat : TOperation); begin case Operat of NEW : FAdmin.SetKey(0); SELECT : FAdmin.SetKey(DataSet.FieldByName(FKey).AsVariant); DELETE : FAdmin.Delete(DataSet.FieldByName(FKey).AsVariant); end; end;
procedure TDBAdmin.SetKey(Value : Variant); begin ... Query.SQL.Add('SELECT * FROM '+FTableName+' WHERE '+FRelKey+' = :PRM'); Query.Prepare; Query.ParamByName('PRM').Value := Value; Query.Open; ... end; |
Fehlermeldung "Fehler im Typenausdruck" ... irgendwas
Habe dann die Tabellenstruktur angesehen die sind bei Delpi unter Samples in der Tabelle
LAGER das Feld Lieferant Nr ist ein "N" Typ aber ich sehe Fleißkomma-Zahlen mit ,00
und die wollte ich in meinem Programm mit LIEFERAN Feld Lieferant Nr verknüpfen
Gibt es überhaupt DB'S die andere Schlüsseltypen als Integer verwenden?
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 10.06.05 19:27
Erstmal erlaubt so ziemlich jede DB, fast alle Datentypen als Schlüssel zu verwenden. Wobei BLOBs (Binary Large Objects, also Bilder etc.) meist ausgeklammert werden.
Ob es SINNVOLL ist, z.B. die Kundennummer auch als Schlüssel zu verwenden sei dahingestellt. Ich persönlich mache das NIE. Aber Dein Problem ist ja auch unabhängig von irgendwelchen primary keys. Du möchtest einfach einen SQL-Ausdruck "FELD = <Wert>" für alle Datentypen und für alle Datenbanken syntaktisch korrekt erzeugen. Das ist nicht sooo einfach.
Aber, Du willst das, ohne grossartige Ahnung von den DBMS zu haben,. DAS ist das Problem. Natürlich gibt es einen Standard, also Strings in Quotes usw, aber beim Thema Datum fängts schon mal an. Ich kenne nur MSSQL gut, aber da ist das Datumsformat abhängig von den Einstellungen. Es gibt zwar ein universelles Format, aber ob das so SQL-Konform ist, das es auch andere DBMS verstehen... keine Ahnung.
Eigentlich musst Du dich darum gar nicht kümmern, weil das eigentlich der DB-Treiber übernimmt. Also ADO, BDE etc. Vielleicht bin ich grad zu blind, aber einen fundamentalen Fehler seh' ich in deinem Code nicht.
Ich gehe mal davon aus, das Du sowas wie einen Profiler hast. Damit solltest Du sehen, was genau zum Server geschickt wird. DAS schaust Du dir mal an. Und/oder postest es hier mal...
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Fr 10.06.05 19:34
Aber ich denke mal dass die meisten DB'S Schlüssel vom Typen Integer haben oder?
Was ist eigentlich wie ich jetzt erwähnt habe bei Fleißkomma-Zahlen eignit sich
der Datentyp Variant nicht?
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 10.06.05 19:38
Nee, die Frage ist falsch. Die 'Schlüssel' legt der Designer ja fest, also derjenige, der die Tabellen entwirft. Erlauben tut das die DB oder nicht. Aber, ich meine, erlaubt ist sogut wie alles. Ich habe z.B. eine Tabelle, deren Schlüssel ist ein Datum. Einfach, weil dann die Datensätze nach Datum sortiert abgespeichert werden. Bei der Datenanalyse nehme ich mir praktisch immer Datensätze innerhalb eines bestimmten Zeitraumes. Und da kommt der SQL-Server dann optimal ohne Zeitverzögerung an (Clustered Index).
Wie gesagt: Besorg Dir ein Programm, das die SQL-Befehle, die zum Server geschickt werden, anzeigt. Bei MSSQL heisst das Teil 'Profiler'. Ohne sowas sollte man IMHO keine DB-Anwendung entwickeln.
Was auch sein kann: Delphi nimmt das Komma als Dezimaltrennzeichen (z.B. 1,23), der SQL-Server will aber den Punkt (1.23)...
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Fr 10.06.05 19:48
Sprechen wir hier von dasselbe? Ich meine mit Schlüssel die eine Verknüpfung zur anderen
Tabelle darstellt! Wer würde z.B. ein String als Primary Key und Foreign Key nehmen?
Meist wird ja ein AoutoInc genommen und der ist ja ein Integer!
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 10.06.05 19:54
Wieso keinen String? Nichts spricht dagegen, außer der gesunde Menschenverstand.  Wenn Du aber eine SW für verschiedene DB schreiben willst, dann kannst Du dich ja nicht drauf verlassen, das alle Tabellen, Primary und Foreign Keys von halbwegs Normalen entwickelt wurden, oder? Oder willst Du einfach eine Meldung auswerfen:
Zitat: | "Sorry, Ihre DB ist zu dämlich, sie wird von dieser Anwendung zu Recht nicht unterstützt, da sie offensichtlich von einem gehirnamputierten Waldschrat entworfen wurde"
|
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Fr 10.06.05 20:01
alzaimar hat folgendes geschrieben: | Oder willst Du einfach eine Meldung auswerfen:
Zitat: | "Sorry, Ihre DB ist zu dämlich, sie wird von dieser Anwendung zu Recht nicht unterstützt, da sie offensichtlich von einem gehirnamputierten Waldschrat entworfen wurde"
|
|
Gute Idee!! 
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Sa 11.06.05 15:19
|
|