1 (edited by alex3513 2016-06-12 19:08:37)

Topic: проблема доступа к записи базе данных.

Скажите пожалуйста, как решить проблему:
с базой работают две программы - myvisualdatabase и другая.
Иногда возникает проблема доступа к записи б.д.
Т.е. если другая программа блокирует запись (на время update ячейки) и в это время visualdatabase пробует сделать также update, возникает ошибка. Как мне сделать проверку, блокирована или нет ячейка б.д. , перед обращением к записи Б.Д. из visualdatabase ???

спасибо.

Re: проблема доступа к записи базе данных.

Приветствую,


Извиняюсь за задержку с ответом, был в отпуске, вопрос все еще актуален для вас?

Dmitry.

Re: проблема доступа к записи базе данных.

здравствуйте. вопрос по поводу символа в hex коде уже не актуален.

У меня другой очень важный для меня вопрос.
Заключается в следующем:
с базой работают две программы - myvisualdatabase и другая.
Иногда возникает проблема доступа к записи б.д.
Т.е. если другая программа блокирует запись (на время update ячейки) и в это время visualdatabase пробует сделать также update, возникает ошибка. Как мне сделать проверку, блокирована или нет ячейка б.д. , перед обращением к записи Б.Д. из visualdatabase ???

спасибо.

Re: проблема доступа к записи базе данных.

alex3513
Работа двух программ происходит в локальной сети?
Как правило запись в базу происходит довольно быстро, при этому MVD имеет тайм аут для записи 3 сек., т.е. если сторонняя программа делает запись не более 3 сек, то проблем быть недолжно.


Можно завести таблицу, в которой будет лишь одна запись для индикации статуса базы данных.
Например записываем в поле isLocked значение 1, перед тем как делать UPDATE, и значение 0 после того как UPDATE запрос был завершен. Также перед UPDATE необходимо проверять это поле, если в нем значение 1, то выводим сообщение, что БД пока занята.


Также могу порекомендовать использовать MySQL вместо SQLite.

Dmitry.

Re: проблема доступа к записи базе данных.

Здравствуйте.
Скажите пожалуйста, а в MVD нет что то типа try-catch из c# ?
спасибо.

Re: проблема доступа к записи базе данных.

Здравствуйте.

Помогите пожалуйста с синтаксисом, не работает update
в чем ошибка непойму
   
    SQLExecute('DROP TABLE IF EXISTS TableLock');
    SQLExecute('CREATE TABLE TableLock (lock);');
    SQLExecute('INSERT INTO TableLock (lock) VALUES ("free");');
    SQLExecute('UPDATE TableLock SET lock = "lock";');

пробовал еще так:
    SQLExecute('DROP TABLE IF EXISTS TableLock');
    SQLExecute('CREATE TABLE TableLock (id integer primary key,lock);');
    SQLExecute('INSERT INTO TableLock (lock) VALUES ("free");');
    SQLExecute('UPDATE TableLock SET lock = "lock"  WHERE TableLock.id = 1;');
так тоже не работает

спасибо.

Re: проблема доступа к записи базе данных.

alex3513
Приветствую,


Должны работать.
Рекомендую вам создать таблицу БД обычным образом, на вкладке "Таблицы базы данных"


Данные в поле вставлять таким образом

SQLExecute ('REPLACE into TableLock (id, lock) VALUES (1, "lock")');
Dmitry.

Re: проблема доступа к записи базе данных.

Дмитрий, дело в том что я создаю таблицу согласно Вашего совета (выше переписка) по поводу блокировки записи б.д. при работе с базой двух программ.
Создается таблица и запись добавляется по insert без проблем. А вот с update проблемы. это не может быть глюком mvdb ? может быть синтаксис у меня неправильный (mvdb в общем то не ругается) ?
еще один вопрос такой: в MVD нет что то типа try-catch из c# ?

Re: проблема доступа к записи базе данных.

ps. в других местах программы я использую update  и вроде там работает с другой таблицей. может быть этот глюк связан с тем что я данную таблицу создавал с помощью sql запроса? а не с помощью mvdb ? что Вы думаете по этому поводу ?

Re: проблема доступа к записи базе данных.

ps.ps. может быть мне везде заменить в программе "update" на "REPLACE into..." ?

Re: проблема доступа к записи базе данных.

Дмитрий спасибо за совет, сейчас проверил...
код:
    SQLExecute('UPDATE `Level` SET `signal` = "l" WHERE Level.id = 1;');
    SQLExecute('DROP TABLE IF EXISTS TableLock');
    SQLExecute('CREATE TABLE TableLock (id integer primary key,lock);');
    SQLExecute('INSERT INTO TableLock (lock) VALUES ("free");');
    SQLExecute ('REPLACE into TableLock (id, lock) VALUES (1, "lock")');

работает правильно (replace меняет значение в ячейке)!