Выполнение SQL-скрипта через TSQLScript...
Модератор: Модераторы
-
avmaksimov
- новенький
- Сообщения: 21
- Зарегистрирован: 17.10.2010 12:38:54
- Контактная информация:
Выполнение SQL-скрипта через TSQLScript...
Пишет "CommitRetaining :
-validation error for column ID, value "*** null ***"" при попытке создания уникального индекса несмотря на то, что пустых значений-то там и нет... Перерыл все и перепробовал все... Из внешних утилит все ОК (SQLLY, IBExpert), а тут странно... Откуда могут появится пустые значения, ума не приложу... Ну не может быть их там по определению!!!
Пример БД, запроса и программы с исходниками во вложении... Похоже на баг, но не уверен... Может я где ошибся!?
-validation error for column ID, value "*** null ***"" при попытке создания уникального индекса несмотря на то, что пустых значений-то там и нет... Перерыл все и перепробовал все... Из внешних утилит все ОК (SQLLY, IBExpert), а тут странно... Откуда могут появится пустые значения, ума не приложу... Ну не может быть их там по определению!!!
Пример БД, запроса и программы с исходниками во вложении... Похоже на баг, но не уверен... Может я где ошибся!?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
Код: Выделить всё
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
- Контактная информация:
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.
avmaksimov
А Вы не пробовали оставлять в скрипте по одной процедуре и проверить, на какой именно происходит ошибка?
А Вы не пробовали оставлять в скрипте по одной процедуре и проверить, на какой именно происходит ошибка?
-
avmaksimov
- новенький
- Сообщения: 21
- Зарегистрирован: 17.10.2010 12:38:54
- Контактная информация:
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
Может сначала попробовать поменять столбец на NOT NULL?
-
avmaksimov
- новенький
- Сообщения: 21
- Зарегистрирован: 17.10.2010 12:38:54
- Контактная информация:
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-файл), то все ОК.
avmaksimov
А Вы можете обычными словами (не кодом
) описать, что эта строка должна сделать? 
avmaksimov писал(а):"ALTER TABLE CONFIG ADD CONSTRAINT PK_CONFIG PRIMARY KEY (ID);"
А Вы можете обычными словами (не кодом
-
avmaksimov
- новенький
- Сообщения: 21
- Зарегистрирован: 17.10.2010 12:38:54
- Контактная информация:
Vadim писал(а):avmaksimovavmaksimov писал(а):"ALTER TABLE CONFIG ADD CONSTRAINT PK_CONFIG PRIMARY KEY (ID);"
А Вы можете обычными словами (не кодом) описать, что эта строка должна сделать?
Прикольно
avmaksimov писал(а):Ну вообще-то добавляет первичный ключ по полю ID с названием PK_CONFIG
Я догадывался об этом, но хотел просто Вас плавно подвести к следующему вопросу.
В колонке, по которой Вы делаете первичный ключ, не должно существовать ни NULLовых значений, ни повторяющихся. Поскольку колонка у Вас уже есть, можно предположить, что там есть и значения какие-то. Какие?
-
avmaksimov
- новенький
- Сообщения: 21
- Зарегистрирован: 17.10.2010 12:38:54
- Контактная информация:
Vadim писал(а):avmaksimov писал(а):Ну вообще-то добавляет первичный ключ по полю ID с названием PK_CONFIG
Я догадывался об этом, но хотел просто Вас плавно подвести к следующему вопросу.
В колонке, по которой Вы делаете первичный ключ, не должно существовать ни NULLовых значений, ни повторяющихся. Поскольку колонка у Вас уже есть, можно предположить, что там есть и значения какие-то. Какие?
Ненулевые... Вообще, я думал, что все заметят, но нет ... в архиве файл есть suo.gdb - там как раз эта таблица CONFIG и есть.
Получается, что либо это баг и мне писать в баг-трекер надо, либо параметр какой-то надо поставить... Чтоб коммит коммитил реально... Хотя и дело не в коммите вроде... Блин, непонятно...
-
avmaksimov
- новенький
- Сообщения: 21
- Зарегистрирован: 17.10.2010 12:38:54
- Контактная информация:
Создал запись в баг-трекере: http://mantis.freepascal.org/view.php?id=17829 . Посмотрим, что ответят!
