Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.104.214] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Читал много ресурсов по поводу работы лайка в селекте с русскими буквами, но так и не нашел рабочего.
Были решения по поводу: select * from tel where Name collate russian Like "%ива%" как быть? |
Сообщ.
#2
,
|
|
|
SQLiteTable3.pas
procedure AnsiUpperFunc(context: Pointer; nArg: Integer; args: PPChar); cdecl; var sVal: PAnsiChar; Buf: AnsiString; Size: Integer; begin try case SQLite3_value_type(args^) of SQLITE_NULL: sqlite3_result_null(context); else begin sVal := PAnsiChar(SQLite3_value_text(args^)); buf := AnsiUpperCase(sVal); SQLite3_result_text(context, PChar(buf), Length(buf), 0); end; end; except sqlite3_result_null(context); Exit; end; end; ... constructor TSQLiteDatabase.Create(const FileName: string); begin ... sqlite3_create_function(fDB, 'AnsiUpper', 1, SQLITE_ANY, nil, @AnsiUpperFunc, nil, nil); ... end; в коде программы: unit Main; ... implementation uses SQLiteTable3; ... ... var sltb:TSQLiteTable; i:integer; s: string; begin Memo1.Lines.BeginUpdate; try Memo1.clear; if CheckBox2.Checked then s := 'SELECT tstamp,notes FROM log WHERE AnsiUpper(notes) LIKE '''+UpperCase(Edit1.text)+''' ORDER BY notes;' else s := 'SELECT tstamp,notes FROM log WHERE notes LIKE '''+Edit1.text+''' ORDER BY notes;'; sltb := sldb.GetTable(s); try for i := 0 to sltb.Count - 1 do begin memo1.Lines.add(sltb.FieldAsString(0)+' = '+sltb.FieldAsString(1)); sltb.Next; end; finally sltb.Free; end; finally Memo1.Lines.EndUpdate; end; Label1.Caption := AnsiUpperCase(Edit1.Text) + ' #' + IntToStr(sltb.RowCount); Button2.Enabled := not CheckBox1.Checked; end; |
Сообщ.
#3
,
|
|
|
Цитата VG_ @ как быть? Перейти на другую СУБД. |
Сообщ.
#4
,
|
|
|
VJean, такого кода у меня небыло в SQLiteTable3.pas, я добавил и вроде работает, но ищет тока точное совпадение, а вот так s := 'SELECT tstamp,notes FROM log WHERE AnsiUpper(notes) LIKE "%'+UpperCase(Edit1.text)+'%" ORDER BY notes;' почемуто не работает. Почему не происходит отбор всех сопадений?
|
Сообщ.
#5
,
|
|
|
VG_, всё происходит может у вас база на UTF8? тогда припишите функцию по разбору WideString (WideUpper, WideLower).
s := 'SELECT tstamp,notes FROM log WHERE AnsiUpper(notes) LIKE "%'+UpperCase(Edit1.text)+'%" ORDER BY notes;'; |
Сообщ.
#6
,
|
|
|
Цитата VJean @ Конечно база в утф8, а что можно и в win-1251 создать?)всё происходит может у вас база на UTF8? Цитата VJean @ я знаю, и поэтому я свое задание переделал на ваш запрос) это мой запрос в программе, в вашей он будет саавсем другой |
Сообщ.
#7
,
|
|
|
VG_, напиши свой запрос, а лучше участок кода с этим запросом.
|
Сообщ.
#8
,
|
|
|
VJean,
//выборка данных из базы sldb.AddSystemCollate; sltb := slDb.GetTable('SELECT * FROM telephons WHERE AnsiUpper(Name) LIKE "%'+ AnsiUpperCase(LabeledEdit2.Text) +'%"'); if sltb.Count > 0 then begin //вывод данных в таблицу for i:=1 to sltb.Count do begin StringGrid1.Cells[0,i] := sltb.FieldAsString(sltb.FieldIndex['ID']); StringGrid1.Cells[1,i] := sltb.FieldAsString(sltb.FieldIndex['Number']); StringGrid1.Cells[2,i] := sltb.FieldAsString(sltb.FieldIndex['Name']); StringGrid1.Cells[3,i] := sltb.FieldAsString(sltb.FieldIndex['Adress']); sltb.Next; StringGrid1.RowCount := i+1; end; end; sltb.Free; |
Сообщ.
#9
,
|
|
|
procedure TForm1.Button2Click(Sender: TObject); var sltb:TSQLiteTable; i:integer; s: string; begin Memo1.Lines.BeginUpdate; try Memo1.clear; if CheckBox2.Checked then s := 'SELECT tstamp,notes FROM log WHERE WideLower(notes) LIKE '''+LowerCase(Edit1.text)+''' ORDER BY notes;' else s := 'SELECT tstamp,notes FROM log WHERE notes LIKE '''+Edit1.text+''' ORDER BY notes;'; sltb := sldb.GetTable(s); try for i := 0 to sltb.Count - 1 do begin memo1.Lines.add(sltb.FieldAsString(0)+' = '+sltb.FieldAsString(1)); sltb.Next; end; finally sltb.Free; end; finally Memo1.Lines.EndUpdate; end; Label1.Caption := AnsiUpperCase(Edit1.Text) + ' #' + IntToStr(sltb.RowCount); Button2.Enabled := not CheckBox1.Checked; Button4.OnClick(Sender); end; |
Сообщ.
#10
,
|
|
|
Эм... а в приведенном коде я не вижу "%" "%" у Like...
и я так понимаю в приаттаченом файле WideLower реализован? и файл не качается |
Сообщ.
#11
,
|
|
|
Цитата VG_ @ % написаны в Edit1Эм... а в приведенном коде я не вижу "%" "%" у Like... Цитата VG_ @ да. WideUpperFunc не сильно отличаетсо от AnsiUpperFunc. и я так понимаю в приаттаченом файле WideLower реализован? и файл не качается |
Сообщ.
#12
,
|
|
|
1.
2.Так в чем причина того, что у тебя работает, а у меня нет? |
Сообщ.
#13
,
|
|
|
1. архив 100% читабелен!
2. Без понятия. У меня Delphi7 (хотя это не должно так повлиять на работу программы), код тоже рабочий, проверенно временем. |
Сообщ.
#14
,
|
|
|
Цитата VJean @ а чем орхивировал если не секрет? :-) 1. архив 100% читабелен! |
Сообщ.
#15
,
|
|
|
Цитата VG_ @ а чем орхивировал если не секрет? :-) Total Commander 7.50a, встроенный ZIP архиватор. ё! мой косяк! упаковывал в LZMA ZIP. (ZIP type 14). Currently only Winzip 12 can unpack it. перезалил нормальный архив. |