Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2007, 15:45   #1
Edimus
Пользователь
 
Регистрация: 30.10.2007
Сообщений: 20
По умолчанию Delphi и InterBase -2

Project Project1.exe raised exception class EIBInterBaseError with message 'violation of PRIMARY or UNIQUE KEY constraint "INTEG_2" on table "LOG"'. Process stopped. Use Step or Run to continue.

Подскажите что нужно поправить?

Вот код:

Код:
procedure TForm2.Button1Click(Sender: TObject);
var f: textfile;
    s:string;
    i,j:byte;
    q,w,n:integer;
    a:string;
  begin

   form1.IBQuery1.Open;

  assignfile(f,'C:\Documents and Settings\iadrozdov\Рабочий стол\access.log.0');
  reset(f);    // откроем файл для чтения
for w:=1 to 5 do     begin
 // while not eof(f) do begin
   readln(f,s); // считаем строку
   memo1.Lines.Append(s); // выведем строку в мемо
   n:=length(s);    // вычислим длину строки
   q:=1;
  for j:=1 to n do
    for i:=1 to n do
   BEGIN

if pos(' ',s)=i then begin //если есть пробел то...
   a:=copy(s,1,i-1);        //скопируем до пробела

   if q=1 then form1.IBQuery2.Params.ParamByName('DT').Value:=a;
   if q=2 then form1.IBQuery2.Params.ParamByName('TC').Value:=strtoint(a);
   if q=3 then form1.IBQuery2.Params.ParamByName('adrk').Value:=a;
   if q=4 then form1.IBQuery2.Params.ParamByName('rp').Value:=a;
   if q=5 then form1.IBQuery2.Params.ParamByName('razm').Value:=strtoint(a);
   if q=6 then form1.IBQuery2.Params.ParamByName('sp').Value:=a;
   if q=7 then form1.IBQuery2.Params.ParamByName('url').Value:=a;
   if q=8 then form1.IBQuery2.Params.ParamByName('login').Value:=a;
   if q=9 then form1.IBQuery2.Params.ParamByName('tipr').Value:=a;

     q:=q+1;

    delete(s,1,i);           //удалим то что скопировали
    n:=length(s);            //вычислим длину строки
while(pos(' ',s)=1)and (length(s)>0) do delete (s,1,1); end;

 end;

 a:=copy(s,1,i);      //скопируем то что осталось

 if q=10 then form1.IBQuery2.Params.ParamByName('vidr').AsString:=a;

 form1.IBQuery2.ExecSQL;
 form1.IBTransaction1.CommitRetaining;


// обновим базу
  form1.IBQuery1.Close;
  form1.IBQuery1.Open;

    END;

 closefile(f);        // закроем файл


end;

Последний раз редактировалось Alex21; 07.11.2007 в 10:53. Причина: заключайте код в специальные теги
Edimus вне форума Ответить с цитированием
Старый 06.11.2007, 19:36   #2
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Опишите структуру таблицы которую вы пытаетесь редактировать и содержимое свойства SQL в IBQuery1.

Таблица должна обязательно содержать ключевое поле. Вы должны получить значение этого поля:
К примеру есть таблица MyTable.
Поля таблицы:
MYTABLE_ID: BIGINT
MYINTFIELD: INTEGER
MYSTRINGFIELD: VARCHAR(20)

В ней первое поле MyTable_ID: BIGINT - первичный ключ. Для генерации уникального значения, должен быть создан генератор (это такой счетчик или ещё называют последовтельность) GEN_MYTABLE_ID(к примеру. В IBExpert смотри раздел генераторы).

Form1.IBQuery1.SQL - содержит следующий SQL запрос:
Код:
INSERT INTO MYTABLE
(
MYTABLE_ID,
MYINTFIELD,
MYSTRINGFIELD
)
VALUES
(
:MYTABLE_ID,
:MYINTFIELD,
:MYSTRINGFIELD
)
 //генерим уникальное значение первичного ключа
Form1.IBQuery1.Params.ParamByName('MYFIELD_ID').Value := IBDatabase1.GenID('GEN_MYFIELD_ID', 1);
Form1.IBQuery1.Params.ParamByName('MYINTFIELD').AsInteger := 10;
Form1.IBQuery1.Params.ParamByName('MYSTRINGFIELD').AsString := 'sdfsf';
Form1.IBQuery1.ExecSQL;
.......................
Т.е. у вас там где заполняете параметры запроса, должна быть строка,
которая генерит уникальное значение первичного ключа(Primary key) - IBDatabase1.GenID('Имя_Генератора_д ля_таблицы', IncValue); Здесь IncValue - значение на которое нужно увеличить уникальный счетчик, обычно 1. В вашем коде нигде нет заполнения ключевого поля уникальным значением.

Второй вариант: Я не знаю содержимое вашей базы и SQL запросов, если уникальное значение первичного ключа у вас всё же генерится, например в триггере, то такая ошибка будет выпадать, если какое либо поле(не первичный ключ) имеет уникальный индекс, такой индекс не разрешит добавить в таблицу записи с одинаковыми значениями по этому полю. Проверте, нет ли в вашей таблице уникальных индексов, кроме первичного ключа...

В вашем примере совершенно ясно одно, поле INTEG_2 имеет уникальный индекс, возможно это первичный ключ, вы автор вам виднее и в это поле вы пытаетесь добавить значение, которое уже есть в в этом поле в предидущих записях....
В вашем коде INTEG_2 нигде не заполняется. Если это первичный ключ, то нужно добавить: Form1.IBQuery1.Params.ParamByName(' INTEG_2').Value := IBDatabase1.GenID('ИМЯ_ГЕНЕРАТОРА', 1); или сделать тоже самое в триггере перед вставкой(BEFORE INSERT).

Последний раз редактировалось Alex21; 07.11.2007 в 10:53. Причина: заключайте код в специальные теги
Rik вне форума Ответить с цитированием
Старый 07.11.2007, 09:55   #3
Edimus
Пользователь
 
Регистрация: 30.10.2007
Сообщений: 20
По умолчанию Опять ошибка! только другая

Project Project1.exe raised exception class EIBInterBaseError with message 'arithmetic exception, numeric overflow, or string truncation
Cannot transliterate character between character sets'. Process stopped. Use Step or Run to continue.


Данные в таблицу записывались отлично... но через некоторое время вылетело это.
Edimus вне форума Ответить с цитированием
Старый 07.11.2007, 09:56   #4
Edimus
Пользователь
 
Регистрация: 30.10.2007
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Rik Посмотреть сообщение
Опишите структуру таблицы которую вы пытаетесь редактировать и содержимое свойства SQL в IBQuery1.

Таблица должна обязательно содержать ключевое поле. Вы должны получить значение этого поля:
К примеру есть таблица MyTable.
Поля таблицы:
MYTABLE_ID: BIGINT
MYINTFIELD: INTEGER
MYSTRINGFIELD: VARCHAR(20)

В ней первое поле MyTable_ID: BIGINT - первичный ключ. Для генерации уникального значения, должен быть создан генератор (это такой счетчик или ещё называют последовтельность) GEN_MYTABLE_ID(к примеру. В IBExpert смотри раздел генераторы).



Form1.IBQuery1.SQL - содержит следующий SQL запрос:
INSERT INTO MYTABLE
(
MYTABLE_ID,
MYINTFIELD,
MYSTRINGFIELD
)
VALUES
(
:MYTABLE_ID,
:MYINTFIELD,
:MYSTRINGFIELD
)
//генерим уникальное значение первичного ключа
Form1.IBQuery1.Params.ParamByName(' MYFIELD_ID').Value := IBDatabase1.GenID('GEN_MYFIELD_ID', 1);
Form1.IBQuery1.Params.ParamByName(' MYINTFIELD').AsInteger := 10;
Form1.IBQuery1.Params.ParamByName(' MYSTRINGFIELD').AsString := 'sdfsf';
Form1.IBQuery1.ExecSQL;
.......................

Т.е. у вас там где заполняете параметры запроса, должна быть строка,
которая генерит уникальное значение первичного ключа(Primary key) - IBDatabase1.GenID('Имя_Генератора_д ля_таблицы', IncValue); Здесь IncValue - значение на которое нужно увеличить уникальный счетчик, обычно 1. В вашем коде нигде нет заполнения ключевого поля уникальным значением.

Второй вариант: Я не знаю содержимое вашей базы и SQL запросов, если уникальное значение первичного ключа у вас всё же генерится, например в триггере, то такая ошибка будет выпадать, если какое либо поле(не первичный ключ) имеет уникальный индекс, такой индекс не разрешит добавить в таблицу записи с одинаковыми значениями по этому полю. Проверте, нет ли в вашей таблице уникальных индексов, кроме первичного ключа...

В вашем примере совершенно ясно одно, поле INTEG_2 имеет уникальный индекс, возможно это первичный ключ, вы автор вам виднее и в это поле вы пытаетесь добавить значение, которое уже есть в в этом поле в предидущих записях....
В вашем коде INTEG_2 нигде не заполняется. Если это первичный ключ, то нужно добавить: Form1.IBQuery1.Params.ParamByName(' INTEG_2').Value := IBDatabase1.GenID('ИМЯ_ГЕНЕРАТОРА', 1); или сделать тоже самое в триггере перед вставкой(BEFORE INSERT).
Спасибо! Да после создания другого уникального ключа все пошло!
Edimus вне форума Ответить с цитированием
Старый 07.11.2007, 12:28   #5
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Цитата:
Сообщение от Edimus Посмотреть сообщение
Project Project1.exe raised exception class EIBInterBaseError with message 'arithmetic exception, numeric overflow, or string truncation
Cannot transliterate character between character sets'. Process stopped. Use Step or Run to continue.


Данные в таблицу записывались отлично... но через некоторое время вылетело это.
Вариантов может быть несколько:
1. Проверьте кодировку текстовых полей вашей таблицы, там где кодировка полей с типом CHAR, VARCHAR не указана, поставте Win1251 и коллате Win1251(или другую, если вас интересует другая напрмер UTF8) и посмотрите, указывали ли вы кодировку по умолчанию при создании базы.

2. Некорректные данные, например вы пытаетесь в поле с типом INTEGER записать не целое число и т.д.

Последний раз редактировалось Rik; 07.11.2007 в 12:31.
Rik вне форума Ответить с цитированием
Старый 07.11.2007, 14:51   #6
Edimus
Пользователь
 
Регистрация: 30.10.2007
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Rik Посмотреть сообщение
Вариантов может быть несколько:
1. Проверьте кодировку текстовых полей вашей таблицы, там где кодировка полей с типом CHAR, VARCHAR не указана, поставте Win1251 и коллате Win1251(или другую, если вас интересует другая напрмер UTF8) и посмотрите, указывали ли вы кодировку по умолчанию при создании базы.

2. Некорректные данные, например вы пытаетесь в поле с типом INTEGER записать не целое число и т.д.
Спасибо! Все поправил!!!
Edimus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
interbase+delphi KiSH333 БД в Delphi 3 15.08.2008 09:53
Си и InterBase Edimus Общие вопросы C/C++ 2 23.11.2007 16:32
Delphi и InterBase Edimus БД в Delphi 12 06.11.2007 14:18
Как из Delphi залезть в системный таблицы InterBase Leee БД в Delphi 0 21.04.2007 21:04
InterBase 6.5 san4es БД в Delphi 0 12.12.2006 20:03