Выполнение SQL-скрипта через TSQLScript...

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
avmaksimov
новенький
Сообщения: 21
Зарегистрирован: 17.10.2010 12:38:54
Контактная информация:

Выполнение SQL-скрипта через TSQLScript...

Сообщение avmaksimov »

Пишет "CommitRetaining :
-validation error for column ID, value "*** null ***"" при попытке создания уникального индекса несмотря на то, что пустых значений-то там и нет... Перерыл все и перепробовал все... Из внешних утилит все ОК (SQLLY, IBExpert), а тут странно... Откуда могут появится пустые значения, ума не приложу... Ну не может быть их там по определению!!!
Пример БД, запроса и программы с исходниками во вложении... Похоже на баг, но не уверен... Может я где ошибся!?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Код: Выделить всё

procedure TMainFrm.btnUpdateDBClick(Sender: TObject);
begin
  IBConnection.HostName := Trim(edtHost.Text);
  IBConnection.Connected:=True;
  SQLTransaction.Active:=True;

  SQLScript.Script.Clear; /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  SQLScript.Script.LoadFromFile(CurPath + 'PatchDB.sql');
  SQLScript.ExecuteScript;
  MessageDlg('Обновление завершено', 'Скрипт выполнен', mtInformation, [mbOK], 0);
end;
avmaksimov
новенький
Сообщения: 21
Зарегистрирован: 17.10.2010 12:38:54
Контактная информация:

Сообщение avmaksimov »

dunin писал(а):

Код: Выделить всё

procedure TMainFrm.btnUpdateDBClick(Sender: TObject);
begin
  IBConnection.HostName := Trim(edtHost.Text);
  IBConnection.Connected:=True;
  SQLTransaction.Active:=True;

  SQLScript.Script.Clear; /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  SQLScript.Script.LoadFromFile(CurPath + 'PatchDB.sql');
  SQLScript.ExecuteScript;
  MessageDlg('Обновление завершено', 'Скрипт выполнен', mtInformation, [mbOK], 0);
end;

Спасибо за ответ, но насколько помню LoadFromFile сам делает очистку TStrings... И не удивительно, что ваш совет не помог...

Да, я забыл указать, что у меня Lazarus: 0.9.28.2.22279 i386-win32-win32/win64, FPC: 2.2.4, Firebird: 2.1.3.18185 Win32 Server.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

avmaksimov
А Вы не пробовали оставлять в скрипте по одной процедуре и проверить, на какой именно происходит ошибка?
avmaksimov
новенький
Сообщения: 21
Зарегистрирован: 17.10.2010 12:38:54
Контактная информация:

Сообщение avmaksimov »

Vadim писал(а):avmaksimov
А Вы не пробовали оставлять в скрипте по одной процедуре и проверить, на какой именно происходит ошибка?

Пробовал... Получается ошибка после последнего коммита после строки "ALTER TABLE CONFIG ADD CONSTRAINT PK_CONFIG PRIMARY KEY (ID);"... Притом, что как видно, в БД ID никогда не принимает значение NULL!!! Я даже пробовал вставлять что-то вроде "update config set id=777 where id=null" - не помогло и 777 нигде не появилось...
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Может сначала попробовать поменять столбец на NOT NULL?
avmaksimov
новенький
Сообщения: 21
Зарегистрирован: 17.10.2010 12:38:54
Контактная информация:

Сообщение avmaksimov »

Brainenjii писал(а):Может сначала попробовать поменять столбец на NOT NULL?

Так он уже NOT NULL:

Код: Выделить всё

ALTER TABLE CONFIG ADD TEMP$$ID Smallint NOT NULL;
COMMIT WORK;
UPDATE CONFIG SET TEMP$$ID = ID;
ALTER TABLE CONFIG DROP ID;
COMMIT WORK;
ALTER TABLE CONFIG ALTER COLUMN TEMP$$ID TO ID;

COMMIT WORK;


Все-таки я все больше склоняюсь к багу Lazarus'а.

P.S. Если выполнить строку "ALTER TABLE CONFIG ADD CONSTRAINT PK_CONFIG PRIMARY KEY (ID);" в следующий раз (т.е. подправить SQL-файл), то все ОК.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

avmaksimov
avmaksimov писал(а):"ALTER TABLE CONFIG ADD CONSTRAINT PK_CONFIG PRIMARY KEY (ID);"

А Вы можете обычными словами (не кодом :) ) описать, что эта строка должна сделать? :)
avmaksimov
новенький
Сообщения: 21
Зарегистрирован: 17.10.2010 12:38:54
Контактная информация:

Сообщение avmaksimov »

Vadim писал(а):avmaksimov
avmaksimov писал(а):"ALTER TABLE CONFIG ADD CONSTRAINT PK_CONFIG PRIMARY KEY (ID);"

А Вы можете обычными словами (не кодом :) ) описать, что эта строка должна сделать? :)

Прикольно :). Ну вообще-то добавляет первичный ключ по полю ID с названием PK_CONFIG - http://www.firebirdsql.su/doku.php?id=constraint.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

avmaksimov писал(а):Ну вообще-то добавляет первичный ключ по полю ID с названием PK_CONFIG

Я догадывался об этом, но хотел просто Вас плавно подвести к следующему вопросу. ;)
В колонке, по которой Вы делаете первичный ключ, не должно существовать ни NULLовых значений, ни повторяющихся. Поскольку колонка у Вас уже есть, можно предположить, что там есть и значения какие-то. Какие?
avmaksimov
новенький
Сообщения: 21
Зарегистрирован: 17.10.2010 12:38:54
Контактная информация:

Сообщение avmaksimov »

Vadim писал(а):
avmaksimov писал(а):Ну вообще-то добавляет первичный ключ по полю ID с названием PK_CONFIG

Я догадывался об этом, но хотел просто Вас плавно подвести к следующему вопросу. ;)
В колонке, по которой Вы делаете первичный ключ, не должно существовать ни NULLовых значений, ни повторяющихся. Поскольку колонка у Вас уже есть, можно предположить, что там есть и значения какие-то. Какие?

Ненулевые... Вообще, я думал, что все заметят, но нет ... в архиве файл есть suo.gdb - там как раз эта таблица CONFIG и есть.

Получается, что либо это баг и мне писать в баг-трекер надо, либо параметр какой-то надо поставить... Чтоб коммит коммитил реально... Хотя и дело не в коммите вроде... Блин, непонятно...
avmaksimov
новенький
Сообщения: 21
Зарегистрирован: 17.10.2010 12:38:54
Контактная информация:

Сообщение avmaksimov »

Создал запись в баг-трекере: http://mantis.freepascal.org/view.php?id=17829 . Посмотрим, что ответят!
Ответить