Datové typy 602SQL x Delphi
Datové typy používané v databázových komponentách Delphi (TFieldType z unity DB) nejsou v některých případech totožné s typy 602SQL serveru. Pro případy, kdy je třeba provádět převody typů mezi oběma systémy (např. při definování vstupních a výstupních parametrů (typu TParam) SQL příkazu v TSQL602Statement nebo uložené procedury v TSQL602StoredProc) nebo vstupních parametrů SELECTu v datasetu TSQL602DataSet, je k dispozici následující tabulka. Ve sloupci Typ Delphi je ukázán typ, v němž je možné uchovávat host variables (viz příklad dole).
typ 602SQL | popis | typ TFieldType | typ Delphi |
CHAR | Znak | ftFixedChar | String |
CHAR(n) | Řetězec znaků | ftString | String |
NCHAR(n) | Řetězec znaků v UNICODE | ftWideString | WideString |
CLOB | Text | ftMemo | String |
NCLOB | Text v UNICODE | N/A | WideString |
BLOB | Binární řetězec proměnné délky | ftBlob | pole znaků |
BINARY | Binární řetězec pevné délky | ftBytes | pole znaků |
BOOLEAN | Ano/Ne | ftBoolean | Boolean |
TINYINT | jednobajtový integer | N/A | ShortInt |
SMALLINT | dvoubajtový integer | ftSmallint | SmallInt |
INTEGER | čtyřbajtový integer | ftInteger | Integer |
BIGINT | osmibajtový integer | ftLargeint | Int64 |
MONEY | starý typ Peníze | ftCurrency | Currency |
NUMERIC(x,y<=4) | přesný číselný typ | ftBCD | Currency |
REAL | Reálné číslo | ftFloat | Double |
DATE | Datum | ftDate | Tdate |
TIME | Čas | ftTime | TTime |
TIMESTAMP | Časová značka | ftDateTime | TDateTime |
Poznámka
NUMERIC(14,2) se nadále konvertuje na ftCurrency ostatní NUMERIC se konvertují na ftBCD, Delphi používají pro reprezentaci ftBCD typ Currency, který může mít maximálně 4 desetinná místa, proto i CDK podporují pouze NUMERIC s maximálně čtyřmi desetinnými místy. Pokus o přístup ke sloupci typu NUMERIC s více než čtyřmi desetinnými místy vyvolá výjimku s kódem WBE_UNSUPATTRTYPE.
Příklad:
Testovací tabulka Types obsahuje sloupce různých typů, pomocí SQL příkazu INSERT vložíme nový záznam s danými hodnotami. Pro vytvoření parametrů je použito metod SetParam.
procedure TForm1.Button1Click(Sender: TObject);
var
bol : Boolean;
sh : smallint;
integ : longint;
big : int64;
realne : double;
datum : TDate;
cas : TTime;
stamp : TDateTime;
text : String;
str : String;
wstr : WideString;
sqlstat : String;
begin
bol := true; // hodnoty vstupních parametrů
sh := -150;
integ := 202;
big := 1234567890123;
realne := 3.14e-1;
datum := StrToDate('31.12.2002');
cas := StrToTime('12:59:01');
stamp := StrToDateTime('31.12.2003 12:59:01');
str := 'řetězec';
wstr := 'unicodový řetězec';
text := 'první řádek'#13#10'druhý řádek';
sqlstat := 'INSERT INTO Types (bol,sh,integ,big,realne,datum,cas,stamp,str,wstr,text) '
+ 'VALUES(:bol,:sh,:integ,:big,:realne,:datum,:cas,:stamp,:str,:wstr,:text)';
with SQL602Statement1 do begin
Statement := sqlstat; // text SQL příkazu
SetParam('bol',ftBoolean,bol,0,ptInput); // vytvoření parametrů
SetParam('sh',ftSmallint,sh,0,ptInput);
SetParam('integ',integ); // overloadovaná metoda pro Integer
SetParam('big',ftLargeInt,big,0,ptInput);
SetParam('realne',ftFloat,realne,0,ptInput);
SetParam('datum',ftDate,datum,0,ptInput);
SetParam('cas',ftTime,cas,0,ptInput);
SetParam('stamp',ftDateTime,stamp,0,ptInput);
SetParam('str',str); // overloadovaná metoda pro String
SetParam('wstr',ftWideString,wstr,0,ptInput); // unicodový řetězec
SetParam('text',ftMemo,PChar(text)^,Length(text),ptInput); // způsob předání hodnoty!!
Execute;
end;
end;