Discussion:
Znaki specjalne w kwerendzie SQL
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Magda S
2007-07-27 17:54:46 UTC
Permalink
Sorry za tak elementarne pytanie, ale naprawdę nie wiem.

Jak w kwerendzie SQL (np. klauzuli VALUES) wpisać znaki "niedrukowalne",
na przykład znak #0 (chodzi o aktualizację pola BLOB).
Buster
2007-07-27 19:28:41 UTC
Permalink
Post by Magda S
Sorry za tak elementarne pytanie, ale naprawdę nie wiem.
Jak w kwerendzie SQL (np. klauzuli VALUES) wpisać znaki "niedrukowalne",
na przykład znak #0 (chodzi o aktualizację pola BLOB).
ZTCP najlepiej się to robiło poprzez parametr (mówimy tu oczywiście o
Delphi. Np. poprzez komponent ADOCommand. We właściwości CommandText
wpisujesz np. takie zapytanie:

update tabela set pole = :param

Następnie w kodzie:

ADOCommand1.Parameters.ParamByName('param'}.DataType := ftBlob;
ADOCommand1.Parameters.ParamByName('param'}.Value := #0;
ADOCommand1.Execute;

Podobnie będzie dla zapytania INSERT

CommandText: insert into tabela (pole) values (:param);

Kod Delphi identyczny.
--
Pozdrowienia
Radek Dobrowolski vel Buster
GG: 1670266
Odpowiadajac na priv, zamien 1 na i w adresie e-mail
Magda S
2007-07-27 21:58:02 UTC
Permalink
Post by Buster
Post by Magda S
Sorry za tak elementarne pytanie, ale naprawdę nie wiem.
Jak w kwerendzie SQL (np. klauzuli VALUES) wpisać znaki
"niedrukowalne", na przykład znak #0 (chodzi o aktualizację pola BLOB).
ZTCP najlepiej się to robiło poprzez parametr (mówimy tu oczywiście o
Delphi. Np. poprzez komponent ADOCommand. We właściwości CommandText
update tabela set pole = :param
ADOCommand1.Parameters.ParamByName('param'}.DataType := ftBlob;
ADOCommand1.Parameters.ParamByName('param'}.Value := #0;
ADOCommand1.Execute;
Podobnie będzie dla zapytania INSERT
CommandText: insert into tabela (pole) values (:param);
Kod Delphi identyczny.
Ale ja korzystam z TQuery.
Buster
2007-07-27 22:29:06 UTC
Permalink
Post by Magda S
Ale ja korzystam z TQuery.
A to zdaje się, że będzie tak samo, tyle że nie Parameters, a Params.
No i Query1.Active := True;
--
Pozdrowienia
Radek Dobrowolski vel Buster
GG: 1670266
Odpowiadajac na priv, zamien 1 na i w adresie e-mail
Magda S
2007-07-28 06:10:43 UTC
Permalink
Post by Buster
Post by Magda S
Ale ja korzystam z TQuery.
A to zdaje się, że będzie tak samo, tyle że nie Parameters, a Params.
No i Query1.Active := True;
Może jestem upierdliwa: użytkownik ma możliwość wprowadzania kwerendy
"ręcznie".
wloochacz
2007-07-28 07:45:43 UTC
Permalink
[ciach]
Post by Magda S
Może jestem upierdliwa: użytkownik ma możliwość wprowadzania kwerendy
"ręcznie".
Faktycznie jesteś.
To nie wpisuje w "kwerendzie" (co za obrzydliwe słowo) parametry (insert
into tabelka(id, bloc) values (:id, :blob)), które należy wyłuskać,
wyświetlić formularz do wygodnego wprowadzania wartości parametrów i
wysłać tak spreparowane zapytanie do SZBD.
Przykład -> IBExpert.
--
wloochacz
Magda S
2007-07-29 18:02:24 UTC
Permalink
Post by wloochacz
[ciach]
Post by Magda S
Może jestem upierdliwa: użytkownik ma możliwość wprowadzania kwerendy
"ręcznie".
Faktycznie jesteś.
To nie wpisuje w "kwerendzie" (co za obrzydliwe słowo) parametry (insert
into tabelka(id, bloc) values (:id, :blob)), które należy wyłuskać,
wyświetlić formularz do wygodnego wprowadzania wartości parametrów i
wysłać tak spreparowane zapytanie do SZBD.
Przykład -> IBExpert.
No to będę bardziej konkretna. W Delphi 4 używam komponentu TQuery i do
pola F (typu BLOB) tabeli T muszę wpisać ciąg #0#4#0#0#1#0#2.
Buster
2007-07-30 06:30:10 UTC
Permalink
Post by Magda S
No to będę bardziej konkretna. W Delphi 4 używam komponentu TQuery i do
pola F (typu BLOB) tabeli T muszę wpisać ciąg #0#4#0#0#1#0#2.
Kurde nie powinienem, ale już trudno.

Query1.SQL.Add('insert into T (pole_blob) values ("' + #0#4#0#0#1#0#2 +
'");';

A potem to już tylko wykonać zapytanie.
--
Pozdrowienia
Radek Dobrowolski vel Buster
GG: 1670266
Odpowiadajac na priv, zamien 1 na i w adresie e-mail
Magda S
2007-07-30 10:43:04 UTC
Permalink
Post by Buster
Post by Magda S
No to będę bardziej konkretna. W Delphi 4 używam komponentu TQuery i
do pola F (typu BLOB) tabeli T muszę wpisać ciąg #0#4#0#0#1#0#2.
Kurde nie powinienem, ale już trudno.
Query1.SQL.Add('insert into T (pole_blob) values ("' + #0#4#0#0#1#0#2 +
'");';
A potem to już tylko wykonać zapytanie.
Nie za bardzo to zadziała, bo string utnie się na pierwszym #0. Gdyby
nie te #0, to w ogóle nie zawracałabym gitary.
zpk
2007-07-30 13:51:32 UTC
Permalink
Post by Magda S
Post by Buster
Post by Magda S
No to będę bardziej konkretna. W Delphi 4 używam komponentu TQuery i
do pola F (typu BLOB) tabeli T muszę wpisać ciąg #0#4#0#0#1#0#2.
Kurde nie powinienem, ale już trudno.
Query1.SQL.Add('insert into T (pole_blob) values ("' + #0#4#0#0#1#0#2 +
'");';
A potem to już tylko wykonać zapytanie.
Nie za bardzo to zadziała, bo string utnie się na pierwszym #0. Gdyby
nie te #0, to w ogóle nie zawracałabym gitary.
Zrób np. tak:

procedure BinTekstBlob(s:string; blob: TField);
var
TempStream : TMemoryStream;
begin
if s='' then exit;
TempStream := TMemoryStream.Create;
TempStream.WriteBuffer(Pointer(s)^, length(s));
TempStream.Seek(0, soFromBeginning); // .Position := 0;
TBlobField(blob).LoadFromStream(TempStream);
TempStream.Free;
end;//

PAweł Krzyżanowski
Grzegorz Skoczylas
2007-07-28 12:37:28 UTC
Permalink
Post by Magda S
Sorry za tak elementarne pytanie, ale naprawdę nie wiem.
Jak w kwerendzie SQL (np. klauzuli VALUES) wpisać znaki "niedrukowalne",
na przykład znak #0 (chodzi o aktualizację pola BLOB).
Odpowiedź na Twoje pytanie może zależeć od tego, jakiej bazy danych
używasz. Na przykład w InterBase i Firebird można użyć funkcje UDF.
Takie funkcje można sobie samemu stosunkowo łatwo napisać. W Internecie
możesz też znaleźć wiele takich bibliotek - darmowych i płatnych. Tobie
potrzebna jest funkcja, które parametrem będzie kod znaku, a wynikiem -
znak o wskazanym kodzie.

Jeżeli użytkownik wprowadza dane "ręcznie" to musisz napisać sobie
podprogram przetwarzający tekst wpisany przez użytkownika na poprawną
instrukcję SQL korzystającą z takiej funkcji UDF.

Tą metodą można przetworzyć wszystkie znaki "niedrukowalne". Nie jestem
tylko pewien, czy znak NUL (znak o kodzie zero) nie będzie stwarzać
jakichś problemów w bazie danych.
--
Pozdrawiam,

Grzegorz Skoczylas
http://gskoczylas.rekord.pl
----------------------------------------------
zpk
2007-07-28 14:02:47 UTC
Permalink
Post by Magda S
Sorry za tak elementarne pytanie, ale naprawdę nie wiem.
Jak w kwerendzie SQL (np. klauzuli VALUES) wpisać znaki "niedrukowalne",
na przykład znak #0 (chodzi o aktualizację pola BLOB).
Daj użytkownikowi możliwość wpisania czegoś w rodzaju tagów, np. gdy
wpisze #0 to program zamieni to na znak o kodzie 0 itd.

Ja stosuję tę metodę np. do wprowadzania daty w szablonach numeracji
dokumentów (<R> oznacza rok itd. - zasada jest ta sama).

Paweł Krzyżanowski
Magda S
2007-08-07 13:59:17 UTC
Permalink
Post by Magda S
Sorry za tak elementarne pytanie, ale naprawdę nie wiem.
Jak w kwerendzie SQL (np. klauzuli VALUES) wpisać znaki "niedrukowalne",
na przykład znak #0 (chodzi o aktualizację pola BLOB).
Już wiem. Przecież jest funkcja CHAR.
zpk
2007-08-08 09:16:13 UTC
Permalink
Post by Magda S
Post by Magda S
Sorry za tak elementarne pytanie, ale naprawdę nie wiem.
Jak w kwerendzie SQL (np. klauzuli VALUES) wpisać znaki "niedrukowalne",
na przykład znak #0 (chodzi o aktualizację pola BLOB).
Już wiem. Przecież jest funkcja CHAR.
A po co funkcja char?
Przy wpisywaniu stringu zawierającego znaki secjalne (w tym o kodzie
0) zastosuj parametryzację sql,

np.

sql:='insert into tab (str) values (:str)';

i następnie

paramByName('str).asString:='Ala'#0'ma kota';

Na pewno zapisze się znak o kodzie 0 wraz z 'ma kota' :)

Pozdrawiam-
Paweł Krzyżanowski
zpk
2007-08-08 09:27:44 UTC
Permalink
Post by zpk
Post by Magda S
Post by Magda S
Sorry za tak elementarne pytanie, ale naprawdę nie wiem.
Jak w kwerendzie SQL (np. klauzuli VALUES) wpisać znaki "niedrukowalne",
na przykład znak #0 (chodzi o aktualizację pola BLOB).
Już wiem. Przecież jest funkcja CHAR.
A po co funkcja char?
Przy wpisywaniu stringu zawierającego znaki secjalne (w tym o kodzie
0) zastosuj parametryzację sql,
np.
sql:='insert into tab (str) values (:str)';
i następnie
paramByName('str).asString:='Ala'#0'ma kota';
Na pewno zapisze się znak o kodzie 0 wraz z 'ma kota' :)
Pozdrawiam-
Paweł Krzyżanowski
Dla pola typu MEMO podałem Ci rozwiązanie wcześniej,

zamiast

paramByName('str).asString:='Ala'#0'ma kota';


napisz

BinTekstBlob('Ala'#0'ma kota', paramByName('str));

Paweł

Loading...