На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> не работает Like , SQLite3
    Читал много ресурсов по поводу работы лайка в селекте с русскими буквами, но так и не нашел рабочего.
    Были решения по поводу:
    ExpandedWrap disabled
      select * from tel where Name collate russian Like "%ива%"
    , но открыв базу в SQLite Expert Pro, увидел что в коллэйт листе нету русского...
    как быть?
      SQLiteTable3.pas
      ExpandedWrap disabled
        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;

      ...
      ExpandedWrap disabled
        constructor TSQLiteDatabase.Create(const FileName: string);
        begin
        ...
            sqlite3_create_function(fDB, 'AnsiUpper', 1, SQLITE_ANY, nil, @AnsiUpperFunc, nil, nil);
        ...
        end;



      в коде программы:
      ExpandedWrap disabled
        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;
      Сообщение отредактировано: VJean -
        Цитата VG_ @
        как быть?

        Перейти на другую СУБД.
          VJean, такого кода у меня небыло в SQLiteTable3.pas, я добавил и вроде работает, но ищет тока точное совпадение, а вот так s := 'SELECT tstamp,notes FROM log WHERE AnsiUpper(notes) LIKE "%'+UpperCase(Edit1.text)+'%" ORDER BY notes;' почемуто не работает. Почему не происходит отбор всех сопадений? :wall:
          Сообщение отредактировано: VG_ -
            VG_, всё происходит ;) может у вас база на UTF8? тогда припишите функцию по разбору WideString (WideUpper, WideLower).
            ExpandedWrap disabled
              s := 'SELECT tstamp,notes FROM log WHERE AnsiUpper(notes) LIKE "%'+UpperCase(Edit1.text)+'%" ORDER BY notes;';
            это мой запрос в программе, в вашей он будет саавсем другой :)
            Сообщение отредактировано: VJean -
              Цитата VJean @
              всё происходит может у вас база на UTF8?
              Конечно база в утф8, а что можно и в win-1251 создать?)

              Цитата VJean @
              это мой запрос в программе, в вашей он будет саавсем другой
              я знаю, и поэтому я свое задание переделал на ваш запрос)
                VG_, напиши свой запрос, а лучше участок кода с этим запросом.
                Сообщение отредактировано: VJean -
                  VJean,
                  ExpandedWrap disabled
                         //выборка данных из базы
                         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;
                    ExpandedWrap disabled
                      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;
                    SQLite3_unit.zip (SQLite3.pas, SQLiteTable3.pas)
                      Эм... а в приведенном коде я не вижу "%" "%" у Like...

                      и я так понимаю в приаттаченом файле WideLower реализован? и файл не качается
                      Сообщение отредактировано: VG_ -
                        Цитата VG_ @
                        Эм... а в приведенном коде я не вижу "%" "%" у Like...
                        % написаны в Edit1
                        Цитата VG_ @
                        и я так понимаю в приаттаченом файле WideLower реализован? и файл не качается
                        да. WideUpperFunc не сильно отличаетсо от AnsiUpperFunc.
                        Сообщение отредактировано: VJean -
                          1.
                          user posted image

                          2.Так в чем причина того, что у тебя работает, а у меня нет?
                          Сообщение отредактировано: VG_ -
                            1. архив 100% читабелен! :)
                            2. Без понятия. У меня Delphi7 (хотя это не должно так повлиять на работу программы), код тоже рабочий, проверенно временем.
                              Цитата VJean @
                              1. архив 100% читабелен!
                              а чем орхивировал если не секрет? :-)
                                Цитата VG_ @
                                а чем орхивировал если не секрет? :-)

                                Total Commander 7.50a, встроенный ZIP архиватор.
                                ё! мой косяк! упаковывал в LZMA ZIP. (ZIP type 14). Currently only Winzip 12 can unpack it.
                                перезалил нормальный архив.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0611 ]   [ 16 queries used ]   [ Generated: 28.04.24, 04:38 GMT ]