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

Database table is locked

09.06.2025, 11:34. Показов 1512. Ответов 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
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,342
Записей в блоге: 3
09.06.2025, 11:47
Delphi
1
2
3
4
5
with FQuery do
 begin
   CLose; // <<== Вот это добавьте
   SQL.Clear;
...
так попробуйте
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru