-
Только начал разбираться с mysql. Теории почти ноль, но я работаю в этом направлении. delphi2007, mysql 4.1, dbExpress, таблица myisam. Не работает код:
procedure Tfrm.Button1Click(Sender: TObject);
var
Id : Integer;
begin
try
with SQLQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('LOCK TABLES contragents Write');
ExecSQL;
SQL.Clear;
SQL.Add('Insert into contragents () values ()');
ExecSQL;
SQL.Clear;
SQL.Add('SELECT id FROM contragents ORDER BY id DESC limit 1');
Open;
id := FieldByName('id').AsInteger;
SQL.Clear;
SQL.Add('UNLOCK TABLES');
ExecSQL;
Close;
end;
except on E:exception do
begin
messagedlg('Ошибочное значение :' + E.Message + '!', mtError, [mbOk], 0);
end;
end;
messagedlg(IntToStr(id), mtInformation, [mbOk], 0);
end;
В таблице автоинкрементное поле Id. Цель: при вставке надо узнать идентификатор вставленной строки и дальше его использовать. На Open программа встает без сообщений, ошибок и т.п. Неужели клиент поставивший блокировку на запись, не может выполнить чтение? В какую сторону копать, чтобы добиться заданной выше цели? Кстати last_insert_id() всегда возвращает ноль, может поэтому поводу тоже меня просветите?
-
> Кстати last_insert_id() всегда возвращает ноль, может поэтому > поводу тоже меня просветите? разве в хелпе мало?
-
> знайка (14.03.13 15:53) [1] > разве в хелпе мало?
Не мало, второй день читаю. Но в чем причина так и не понял. Про какие-либо ограничения на myisam я не нашел, а пока в голову приходит только это.
-
> last_insert_id это типа @@IDENTITY в mssql? типа с действием на сессию (не вижу указания таблицы как в IDENT_CURRENT) тогда может зависеть от того настроен ли компоненту SQLQuery постоянный коннект, или прописана строка подключения (?) и он пере создается на каждый запрос (а соответственно и сессия накрывается)
также может зависеть от настройки в коннекте типа "кипконестион".
-
++ сори, не обратил внимания на "dbExpress"... там вроде нет строк коннекта в кверях... т.е. сразу см. второе.
а кстати пакеты из комманд MySQL позволяет?
-
> sniknik © (14.03.13 17:27) [3]
так точно: с действием на сесию. keepconnection = true, В компоненте SQLQuery прописан SQLConnection = SQLConnection1 и подключение прописано уже в нем, не знаю накрывается ли в этом случае сессия, но если да, то с last_insert_id становится понятно. Указание таблицы тоже ничего не меняет. Но основной то вопрос у меня по блокировке...
-
Так... эксперименты показали следующее: выполнение запроса LOCK TABLES contragents Write;
Insert into contragents () values ();
SELECT id FROM contragents ORDER BY id DESC limit 1;
UNLOCK TABLES; в программе-администраторе heidiSQL приводят к необходимому и ожидаемому результату в виде последнего значения автоинкремента. Т.е. моя проблема не в SQL, а в неправильном использовании delphi/dbexpress. Причем в первом посте я привел хоть и опробованный, но все-таки упрощенный код. Рабочий фрагмент отличается только тем, что имя базы, имена столбцов и устанавливаемых значений передаются строковыми переменными при SQL.ADD(...) Так вот, в этом куске кода программа встает еще на том ExecSQL; который после инсерта. Подскажите, какими средствами отладки (особенно если они в самой D2007) можно пользоваться в этом случае. Хотя понятно что дело в кривой блокировке, только как эту "кривость" победить? Как добиться выполнения запросов в одной ... даже и не знаю ... сессия вроде одна, транзакций в myism нет...
-
Отвечаю, если кому интересно: при доступе через Zeos все работает. Это не значит что dbExpress не работает, точнее необязательно это так, может я чего то не донастроил. Но все равно как то странно, что что-то работает, а что-то нет. Не исключаю, что в зевсе не будет работать что-либо другое :) Оставлю оба компонента :) все равно выяснить причину неработоспособности не смогу. И кстати: в зевсе корректно работает и last_insert_id. Повторюсь: в коде не менял ни символа только SQLQuery на ZQuery и все заработало.
|