Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297

Database table is locked

09.06.2025, 11:34. Показов 1639. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые кодеры.
Бьюсь над вопросом уже неделю и никак не могу решить. Есть класс, который хранит в себе цвет и самый похожий на него цвет из базы данных. Подключение к базе данных SQLite происходит на уровне этого класса. Есть StringGrid, который хранит в себе эти объекты. Если вдруг пользователь видит, что похожий цвет его не устраивает, он может вызвать контекстное меню, в котором он бы хотел для этого цвета посмотреть весь перечень цветов из базы данных, отсортированный по расстоянию от оригинала (все цвета из базы данных от самого близкого и дальше).
Класс реализован следующим образом (упрощенно): если state=sOne, то запрос выдает только один цвет, если state=sMany, то выдает все цвета, отсортированные по расстоянию от оригинала.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
type
TState = (sMany, sOne);
TCell = class
 
    private
    Fcolor: TColor;     //оригинал
    FSimName: string;
    FConn: TfdConnection;
    Fquery: TfdQuery;
    FSimilar: TColor;   //похожий цвет из базы данных
    FState: TState;    //состояние
    procedure SetColor(const Value: TColor);
    procedure SetState(const Value: TState);
 
    public
    property Color:TColor read FColor write SetColor;
    property Similar:TColor read FSimilar;
    property State: TState write SetState;
    property Query: TFdQuery read FQuery;
    constructor Create;
  end;
implementation
 
 
{ TCell }
constructor TCell.Create;
begin
  Fconn:=TFDConnection.Create(Application);
  Fconn.Params.Clear;
  Fconn.Params.Add('Database='+ ExtractFilePath(ParamStr(0)) + 'listofColorsExt.db');
  FConn.Params.Add('DriverID=SQLite');
  Fconn.Connected:=true;
  fquery:=tfdquery.Create(application);
  fquery.Connection:=fconn;
end;
 
procedure TCell.SetColor(const Value: TColor);
var r,g,b: integer;  s:string;
begin
  FColor := Value;
  r:=GetRValue(FColor);
  g:=GetGValue(FColor);
  b:=GetBValue(FColor);
  with FQuery do
  begin
    SQL.Text:=Format('update colors set s=(%d-r)*(%d-r)+(%d-g)*(%d-g)+(%d-b)*(%d-b)',[r,r,g,g,b,b]);
    ExecSQL;
    SetState(sOne);
    FSimilar:=RGB(fields[4].AsInteger,fields[5].AsInteger,fields[6].AsInteger);
    FSimName:=fields[3].AsString;
    active:=false;      //как только нашел похожий цвет - тут же отключайся.
  end;
end;
 
procedure TCell.SetState(const Value: TState);
begin
  FState:=value;
  with FQuery do
  begin
    SQL.Clear;
    if value=sOne then
    begin
      SQL.Add('select * from colors where s=(select min(s) from colors) ');
    end else
      SQL.Add('select * from colors ');
    Open;
  end;
end;
Всё прекрасно работает для одного цвета. Но если я хочу вызвать форму (передав ей объект с целью отобразить множество цветов), появляется ошибка 'Database table is locked'. При этом ошибка остается, если я использую Query объекта, а также если создаю свой connection, query на форме.
Delphi
1
2
3
4
5
6
7
8
9
10
11
constructor TPopupForm.Create(owner: Tcomponent; cell: TCell);
begin
    inherited Create(owner);
    FCell:=cell;
end;
 
procedure TPopupForm.FormCreate(Sender: TObject);
begin
  Fcell.state:=smany;
  DataSource.dataset:=Fcell.query;
  dbtext1.DataField:='name';
Почему так происходит, ведь я отключаюсь каждый раз, когда нахожу нужный цвет, поэтому таблица не должна быть заблокированной? Есть ли какие-то обходные пути кроме ведения двух параллельных баз данных (в моем случае это годится, но это мовитон).
Прошу прощения за сложность, но я даже не знаю, как задать вопрос проще.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.06.2025, 11:34
Ответы с готовыми решениями:

Delphi SQLite database is locked
Добрый день. Сразу скажу: форумы читал, гуглил. Ничего не помогло. Ситуация такая: Не могу...

Ошибка "could not update currently locked"
У меня есть программа написанная на Delphi, которая управляет базой данных access, подключение чрез...

Ошибка в delphi ora-22920 row containing the lob value is not locked при смене типа поля с VARCHAR2 (4000 Byte) на clob
Добрый день! Я с делфи не опытный(( Подскажите по такой проблеме... Было поле в табличке...

4
Модератор
 Аватар для D1973
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,399
Записей в блоге: 3
09.06.2025, 11:47
Delphi
1
2
3
4
5
with FQuery do
 begin
   CLose; // <<== Вот это добавьте
   SQL.Clear;
...
так попробуйте
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,667
Записей в блоге: 21
09.06.2025, 12:24
Лучший ответ Сообщение было отмечено t232006 как решение

Решение

очень злой алгоритм
при запросе всем цветам прописывается расстояние от того цвета, который я запросил
а почему бы просто ничего никуда не писать, а аналогичным запросом получить результат и все?
и ничего вообще лочиться не будет
1
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
09.06.2025, 13:15  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
а почему бы просто ничего никуда не писать, а аналогичным запросом получить результат и все?
странно. Почему-то об этом не подумал. Да, надо бы попробовать. Спасибо.
Цитата Сообщение от D1973 Посмотреть сообщение
1

with FQuery do
 begin
   CLose; // <<== Вот это добавьте
   SQL.Clear;
...
Не получается. Все равно лочит.
0
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
09.06.2025, 20:49  [ТС]
krapotkin, вы, как всегда, были правы. Убрал вычисляемое поле и вставил вычисление расстояния в тело запроса в виде обобщенного представления - и лочить перестало.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.06.2025, 20:49
Помогаю со студенческими работами здесь

Подключился к БД через DataBase к SQL Server и огреб проблем
Создал приложение. Подключился к БД через DataBase к SQL Serverу. В TQuery создал запрос. Данные...

Вставить данные в таблицу table1 (Database Desktop)
Всем привет. Мне надо вставить данные в таблицу table1 (Database Desktop). Этот код работает, но...

"An error occurred while attempting to initialize the Borland Database Engine (error $210C)"
У меня вылезла ошибка: &quot;An error occurred while attempting to initialize the. Borland Database...

Создание БД в Delphi (DATABASE, PARADOX 7)
Здравствуйте. очень нужна ваша помощь. сейчас бьюсь над базами данных, и ничего в них не смыслю....

Как вызвать диалог «Database Editor» компонента TpFIBDatabase ?
везде пишут, что &quot;component editor&quot; вызывается путем 2-го кликанья мышкой на компонент, а у меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru