Avatar billede martin_andersen Nybegynder
24. november 2005 - 15:39 Der er 6 kommentarer

ADOQuery.sql.text og unicode?

Jeg har et spørgsmål vedr. ADOQuery:

Jeg har en database(unicode) hvor jeg henter navne ud på forskellige sprog. Disse navne viser jeg herefter i et grid(TnTStringGrid). Dette fungere fint.

Men jeg vil nu gerne kunne søge på et navn også. Altså skrive et eksempelvis russisk navn i en TnTEditbox og derefter søge på navnet.

ADOQuery.sql er af typen TStrings!?

Hvordan kan jeg indføre en widestring(russisk navn) i min sql statment? Eller kan det lade sig gøre?
Avatar billede janbb Juniormester
25. november 2005 - 11:48 #1
Jeg kender ikke den DB du bruger, men det er formentl. ikke væsentligt.
Det er en kompliceret sag at søge i 'alle' felter' tekstmæssigt og jeg har aldrig forstået metoden særlig godt, men enk. programmer af typen har jeg set her på E gennem tiden (Borrisholt ? eller var det snowball ?).
I hvert fald kan jeg lige ref. proceduren fra programmet, såfremt du bedre kan gennemskue metoden ?.
procedure TFMain.BitBtn2Click(Sender: TObject);
var
  D1: TADODataSet;
  I: Integer;
begin
  D1 := TADODataSet.Create(self);
  D1.Connection := ADOConnection1;
  D1.Close;
  If CBAlleDatoer.Checked Then
    D1.CommandText := 'Select * FROM tbl_Artikler ' +
                      'WHERE Forfatter LIKE :pForfatter AND Overskrift LIKE :pOverskrift ' +
                      'AND [Resume] LIKE :pResume AND (Dato BETWEEN #01-01-1900# AND #31-12-2999#) ' +
                      'AND Artikel LIKE :pArtikel'
  Else Begin
    D1.CommandText := 'Select * FROM tbl_Artikler ' +
                      'WHERE Forfatter LIKE :pForfatter AND Overskrift LIKE :pOverskrift ' +
                      'AND [Resume] LIKE :pResume AND Dato = #' + KonverterDato(DateToStr(DTPSoegDato.Date)) + '#' +
                      'AND Artikel LIKE :pArtikel';
  End;
  D1.Parameters.ParamByName('pForfatter').Value := '%' + ESoegForfatter.Text + '%';
  D1.Parameters.ParamByName('pOverskrift').Value := '%' + ESoegOverskrift.Text + '%';
  D1.Parameters.ParamByName('pResume').Value := '%' + ESoegResume.Text + '%';
  D1.Parameters.ParamByName('pArtikel').Value := '%' + ESoegArtikel.Text + '%';
  D1.CommandType := cmdText;
  D1.Open;
  If D1.RecordCount > 0 Then
    SGResultat.RowCount := D1.RecordCount + 1
  Else
    SGResultat.RowCount := 2;
  For I := 1 To D1.RecordCount Do Begin
    SGResultat.Cells[0,i] := D1.FieldByName('Forfatter').AsString;
    SGResultat.Cells[1,i] := D1.FieldByName('Overskrift').AsString;
    SGResultat.Cells[2,i] := D1.FieldByName('Resume').AsString;
    SGResultat.Cells[3,i] := D1.FieldByName('Dato').AsString;
    D1.Next;
  End;
  D1.Free;
end;
Avatar billede martin_andersen Nybegynder
25. november 2005 - 12:51 #2
Tak for svaret.

Jeg kan se idéen i at anvende parameters objektet. Men hvordan har du oprettet disse params, designtime eller?

jeg har forsøgt uden held med:
P_ADOQuery.Parameters.CreateParameter('pObjName', ftWideString, pdInput, 0, ObjName);
Avatar billede janbb Juniormester
26. november 2005 - 14:38 #3
jeg lagde hele proceduren ind i forb. m. spm.  http://exp.dk/spm/662012
fornylig: ADOConnection1 (er såvidt jeg husker lagt ind i forvejen) og i det her tilf. aktiveres den så ved behov.Som sagt er det ikke et program jeg har lavet, da det er for svært for mig, men jeg har 'leget' en del med at bruge SQL-statements som søge-element fx lave lister over felter, hvori der i søgeordet indgår en string.
Men det er næppe brugbart i et 'ordbogs-program', medmindre man kan kæde et edtfelt sammen med et SQL-statement ?.Det var bare en strøtanke.Har ikke helt gennemtænkt det.
Avatar billede janbb Juniormester
26. november 2005 - 15:25 #4
Altså, (hvis det 'bare' er til 'hjemmebrug'
lave noget i retning af:
procedure TMyForm1.BitBtn9Click(Sender: TObject);
begin
  ADOQuery2.SQL.Text:=Edit1.Text;
 
ADOQuery2.Open;

Hvor du så selv sætter søgeordet ind i strengen fx:
select * from [vejledn] where sogeord like "pasc" or sogeord like "memo%"  //edit1.text

Men skal det være mere proff' skal der gøres noget ud af at fjerne de tekniske 'formularer'
fra søgefeltet ;)
Avatar billede janbb Juniormester
26. november 2005 - 15:42 #5
I det nævnte programeks m. edit-felt åbnes og lukkes forb. til db ved hver søgn

(ved ikke om det kan gi nogle ideer til dig, der jo sikkert er langt mere avanceret
udi programmeringskunst).Den der DB - unicode, hvad er det i grunden - har du et lille link man kan læse lidt om det - nå jeg kan jo osse prøve at lede selv.

programmet er spækket med andre ting der nok bare forvirrer (faste søgn i combobox og sammenkædning af de fundne textfiler), men:  :)

procedure TMyForm1.FormCreate(Sender: TObject);
var ConStr: widestring;
begin
ConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;'+
          'Data Source=dadob2.mdb;'+
          'Persist Security Info=False';


DBGrid3.DataSource := DataSource1;
DataSource1.DataSet := ADOQuery1;
ADOQuery1.Connection := ADOConnection1;
ADOConnection1.ConnectionString := ConStr;
ADOConnection1.LoginPrompt:=False;

//Edit2.Text:='save before navigate';
Memo1.Text:='';
end;
procedure TMyForm1.Button1Click(Sender: TObject);
var
  shtml    : widestring;
  htmlfile  : TextFile;
  i        : integer;
  AvailableFields: set of  TFieldType;
begin
AvailableFields:=[ftWideString, ftDate,  ftFloat];
//open query
//ADOQuery1.SQL.Text:=Edit2.Text;
  ADOQuery1.SQL.Text:=Combobox1.Text;
ADOQuery1.Open;
Avatar billede martin_andersen Nybegynder
29. november 2005 - 10:28 #6
Jeg har lavet et lille forsøg med henblik på at teste brugen af variabler.
Jeg har vedlagt et eksempel herunder. Nedenstående kode virker fint hvis jeg indtaster normal tekst til variablen, men jeg får en fejl hvis jeg indtaster eksempelvis '%æøå%'. Jeg kan derudover ikke sætte variablens datatype til "ftWideString" designtime. så jeg tror det kan være årsagen til at den ikke vil æde '%æøå%'.

//--------------------------------------------------- 
P_ADOQuery.Close;
P_ADOQuery.SQL.text := 'select * from m2kv_fdk_image where obj_name like :pObjName';

P_ADOQuery.Parameters.ParamByName('pObjName').DataType := ftWideString;
P_ADOQuery.Parameters.ParamByName('pObjName').Value := TnTEdit1.text;

P_ADOQuery.Open;

TnTStringgrid1.RowCount := 1;
if P_ADOQuery.RecordCount > 0 then
  TnTStringgrid1.RowCount := P_ADOQuery.RecordCount+1
else
begin
  TnTStringgrid1.RowCount := 2;
  TnTStringgrid1.Rows[1].Clear;
end;
TnTStringgrid1.FixedRows := 1;

//build result list
i := 1;
P_ADOQuery.First;
while not P_ADOQuery.EOF do
begin
  TnTStringgrid1.cells[0,i] := UTF8ToWideString(P_ADOQuery.FieldByName  ('obj_id').AsString);
  TnTStringgrid1.cells[1,i] := UTF8ToWideString(P_ADOQuery.FieldByName('obj_name').AsString);
  inc(i);
  P_ADOQuery.next
end;
//----------------------------------------------------------
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester