Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TQuery [D5, Win95/98]


DimChan ©   (2003-10-24 07:21:00) 

Приветствую вас, МАСТЕРА. Использую функцию Query1.SQL.ADD (Sender: String) - но вот проблема моя переменная SqlStr превышает барьер в 256 символов:

SqlStr := "Select * From "" + FilePath +"" Terror where ("
+ Pole[1] +" Like "%" + SenderStringName +"%") or ("
+ Pole[2] +" Like "%" + SenderStringName +"%") or ("
+ Pole[3] +" Like "%" + SenderStringName +"%")... or ("
+ Pole[n] +" Like "%" + SenderStringName +"%")";


Дело в том, что переменная складывается циклом из n столбцов таблицы, буду благодарен за помощь или подсказку.


DimChan   (2003-10-29 07:06:00) [1]


> ЮЮ © (25.10.03 07:07) [16]

Ты прав 3 из 17 не текстовые, а числовые(Numeric).


ЮЮ   (2003-10-25 07:07:00) [2]

У тебя все 17 полей, по которым ты ищешь, текстовые? Если нет, то ошибка неизбежна и именно "Type mismatch in expression". См. ЮЮ © (24.10.03 09:37) [8]


OlegK   (2003-10-24 17:00:00) [3]

2Юрий Зотов
Хмм… извиняюсь за «наезд не по теме» ;-) Вы правы, я недостаточно внимательно прочитал предыдущий Ваш ответ… всему виной катастрофическая нехватка времени…


BlackKing   (2003-10-24 14:33:00) [4]

A ne probovali etu stroku razbit" na chasti?

vmesto

s:=s1+s2+s3+s4...

pisat"

Query.sql.add(s1);
Query.sql.add(s2);
Query.sql.add(s3);
...


Юрий Зотов   (2003-10-24 13:44:00) [5]

> OlegK (24.10.03 11:17) [11]

1. Да, спасибо, я в курсе. Еще со времен Delphi 2.

2. > Кстати, как раз-таки выключение этой опции, как вы
> советуете, и приведет к ограничению максимального размера
> строки

Пожалуйста, читайте ВНИМАТЕЛЬНЕЕ:
... УБЕРИТЕопцию $H- ...
Где здесь сказано о ВЫКЛЮЧЕНИИопции H? Наоборот, речь идет как раз о ее ВКЛЮЧЕНИИ.

Вероятно, есть разница между " убрать опцию $H-" и " выключить опцию Н"? Потому что первое приведет как раз к обратному результату. Что в данном случае и требуется.


CbIH   (2003-10-24 12:10:00) [6]

QTable.SQL.Add (SqlStr);
QTable.Active := true; //Здесь дает ошибку


QTable.SQL.Text := SqlStr;


OlegK   (2003-10-24 11:17:00) [7]

2Юрий Зотов
>Нажмите F1 и прочтите топик $H.
>Потом уберите опцию $H- и больше ничего не надо.

Хммм... насколько известно, опция:"$H-" используется для совместимости предыдущей версии string используемой в Object Pascal
привожу выдержку:"The {$H-} state is mostly useful for using code from versions of Object Pascal that used short strings by default"...
Кстати, как раз-таки выключение этой опции, как вы советуете, и приведет к ограничению максимального размера строки, а вот включенная по умолчанию в Delphi опция "$H+" позволяет использовать длину строк значительно превышающую порог в 256 символов, вот выдержка из того же самого Help-а: «AnsiString, also called a long string, represents a dynamically allocated string whose maximum length is limited only by available memory. It uses 8-bit ANSI characters.»
И по существу, ветки, скорее всего ошибка в корректности составленного запроса…


Zacho   (2003-10-24 10:24:00) [8]


> DimChan © (24.10.03 10:17) [9]
>
> QTable.SQL.Add (SqlStr);
> QTable.Active := true; //Здесь дает ошибку

Перед QTable.Active:=true; сделай ShowMessage(QTable.SQL.Text);
и приведи полученный текст запроса, а заодно и сообщение об ошибке. Тогда может и подскажем.


DimChan   (2003-10-24 10:17:00) [9]

Тогда вот код, может я что-то не так делаю?

var n, i : integer;//
QField, SqlOr, SqlLike, SenderStrName : String;//Для запроса
SqlStr: String;
begin

QProba.Active := false;
QProba.SQL.Clear ;
QProba.SQL.Add ("Select * From "" + FilePath +"" Adress");
QProba.Active := true;
SenderStrName := edit1.Text ;

if SenderStrName = "" then exit;

SqlOr := (" or (");
SqlLike := (" Like "%" + SenderStrName +"%")");

i := QProba.FieldCount - 1;

pole[0] := QProba.Fields[0].fieldName;

SqlStr := ("Select * From "" + FilePath +"" Adress where ( " + Pole[0] + SqlLike );


QTable.Active := false;
QTable.SQL.Clear ;

For n := 1 to i do // i := 17
begin
pole[n] := QProba.Fields[n].fieldName;
QField := pole[n];

sqlStr := (SqlStr + SqlOr + QField + SqlLike) ;

end;

QTable.SQL.Add (SqlStr);
QTable.Active := true; //Здесь дает ошибку

DataSource2.dataSet := QTable;
DBGrid1.DataSource := DataSource2;


ЮЮ   (2003-10-24 09:37:00) [10]

>поэтому я пологаю, что Query1.SQL.ADD кроме String больше ничего не поддерживает...

Нет, это просто запрос конструкции
... AND (Field LIKE "%всяка-бяка%") AND ...
можно использовать только для текстовых полей, но нельзя для числовых. Именно там и происходит "Type mismatch in expression", а вовсе не при Query1.SQL.ADD ("...")


Юрий Зотов   (2003-10-24 09:23:00) [11]

> DimChan © (24.10.03 09:17) [6]

> String - поддерживает переменную длинной от 0 до 255 символов,
> Я пробовал AnsiString, но...

Нажмите F1 и прочтите топик $H.
Потом уберите опцию $H- и больше ничего не надо.


DimChan   (2003-10-24 09:17:00) [12]


> NAlexey © (24.10.03 09:03) [5]
> >превышает барьер в 256 символов:
> Какой такой барьер в 256 символов??? -


String - поддерживает переменную длинной от 0 до 255 символов, Я пробовал AnsiString, но
> Query1.SQL.ADD (Sender: String)

и выдает ошибку Type mismatch in expression, поэтому я пологаю, что Query1.SQL.ADD кроме Stringбольше ничего не поддерживает...


NAlexey   (2003-10-24 09:03:00) [13]

>превышает барьер в 256 символов:
Какой такой барьер в 256 символов??? -

The reserved word string functions like a generic type identifier. For example,

var S: string;

creates a variable S that holds a string. In the default {$H+} state, the compiler interprets string (when it appears without a bracketed number after it) as AnsiString. Use the {$H–} directive to turn string into ShortString.

А

AnsiString ~2^31 characters 4 bytes to 2GB 8-bit (ANSI) characters


DimChan   (2003-10-24 09:00:00) [14]


> Романов Р.В. © (24.10.03 08:08) [3]
> Query1.SQL.ADD("Select * From "" + FilePath +"" Terror where
> (")
> Query1.SQL.ADD(Pole[1] +" Like "%" + SenderStringName +"%")")
> Query1.SQL.ADD(or ("Pole[2] +" Like "%" + SenderStringName
> +"%")")
> и т.д.


Это не подходит, а вот

> TQuery.Params

я посмотрел, но так и не понял что ты имел в виду???


Романов Р.В.   (2003-10-24 08:08:00) [15]

Query1.SQL.ADD("Select * From "" + FilePath +"" Terror where (")
Query1.SQL.ADD(Pole[1] +" Like "%" + SenderStringName +"%")")
Query1.SQL.ADD(or ("Pole[2] +" Like "%" + SenderStringName +"%")")
и т.д.
А вообще то в этом случае удобно использовать TQuery.Params


DimChan   (2003-10-24 08:01:00) [16]


> Романов Р.В. © (24.10.03 07:41) [1]
> Добавляй в несколько строк

???


Романов Р.В.   (2003-10-24 07:41:00) [17]

Добавляй в несколько строк


Наверх

Титульная страница Поиск, карта сайта Написать письмо