С такой ошибкой уже есть темы, но мне они не помогли. Может я что-то не понимаю, если так, тогда прошу прощения.
Имеется программа, которая получается список установленных программ и из него формирует sql запрос для сравнения с базой в SQLite3, далее отображаются в DBGrid совпадения с базой. Так вот, при большом количестве совпадений с базой появляется ошибка Unrecognized token.
- То есть, если установлено очень много программ, но совпадений с базой не много, тогда такой ошибки нет
Хочу обратить внимание на то, что на другом компьютере такой проблемы вообще нет. Прикладываю скриншот Showmessage(s) с другого компьютера (пусть будет второй компьютер).
Долго не мог понять с чем связано. Понял, когда на третьем компьютере из реестра все программы добавил в базу. То есть, до этого на третьем компьютере не было такой проблемы. Везде ОС Windows 7 x64.
Подскажите пожалуйста, не могу сам разобраться. Ниже привожу код всей процедуры. Если нужно что-то ещё, только скажите. Заранее благодарен за любую помощь!
- Код: Выделить всё
procedure TfMian.mBeginSerchClick(Sender: TObject);
var
MyList: TStringList; // для хранения названий ключей реестра, нужна для извлечения DisplayName в MyList2
MyList2: TStringList; // содержит DisplayName, объявлен глобально
MyRegistry: TRegistry;
s: string; // в неё записывается готовый sql запрос
i : integer; // нужна для счетчика цикла for
Str: string; // используется для получения DisplayName
begin
Cursor:= crHourGlass;
bSearch.Visible:=False; //скрываем кнопку начать поиск
MyList2:=TStringList.Create;
MyRegistry:=TRegistry.Create(KEY_WOW64_64KEY);
MyList:=TStringList.Create;
// далее получаем список программ и записываем в MyList2
// цикл for дублируется, чтобы получать и 32-битные и 64-битные
with MyRegistry do
begin
RootKey:=HKEY_LOCAL_MACHINE;
OpenKeyReadOnly('Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\');
GetKeyNames(MyList);
CloseKey;
for i:=0 to MyList.Count-1 do
begin
RootKey:=HKEY_LOCAL_MACHINE;
OpenKeyReadOnly('Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\'+
MyList[i]);
Str:=ReadString('DisplayName');
if Str<>'' then
MyList2.Add(ReadString('DisplayName'));
CloseKey;
end;
RootKey:=HKEY_LOCAL_MACHINE;
OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\Uninstall\');
GetKeyNames(MyList);
CloseKey;
for i:=0 to MyList.Count-1 do
begin
RootKey:=HKEY_LOCAL_MACHINE;
OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\Uninstall\'+
MyList[i]);
Str:=ReadString('DisplayName');
if Str<>'' then
MyList2.Add(ReadString('DisplayName'));
CloseKey;
end;
end;
//далее составляем sql запрос и присваиваем его переменной s
with MyList2.Create do
try
MyList2.StrictDelimiter := true;
s := '';
for i := 0 to MyList2.Count - 1 do if Trim(MyList2.Strings[i]) <> '' then
s := s + Format('%s(name LIKE "%%%s%%")', [IfThen(i = 0, '', ' OR '), MyList2.Strings[i]]);
s := 'SELECT * FROM program WHERE ' + s + ' ORDER BY id';
finally
end;
// всё, в s хранится запрос, он используется для получения данных из БД
Showmessage(s);
MyList.Free; // в ней не хранится DisplayName, поэтому освобождаем память
SQLQuery1.Close;
SQLQuery1.Active:=false;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add(s);
SQLQuery1.Active:=true;
SQLQuery1.Open;
//заполняем заголовки колонок и меняем ширину колонок
DBGrid1.Columns[1].Title.Caption:='Название';
DBGrid1.Columns[2].Title.Caption:='Тип ПО';
DBGrid1.Columns[3].Title.Caption:='Лицензия';
DBGrid1.Columns[4].Title.Caption:='Стоимость';
DBGrid1.Columns[5].Title.Caption:='Замена';
DBGrid1.Columns[1].Width:= 200;
DBGrid1.Columns[2].Width:= 150;
DBGrid1.Columns[3].Width:= 110;
DBGrid1.Columns[4].Width:= 90;
DBGrid1.Columns[5].Width:= 150;
end;