В базу записывается не то число которое подставил

Обсуждение возникших проблем, предложений и ошибок MyDAC компонентов
Закрыто
Sanya111
Сообщения: 26
Зарегистрирован: Пн 02 июл 2012 14:07

В базу записывается не то число которое подставил

Сообщение Sanya111 » Чт 09 авг 2012 12:37

Привет.
Объясните, пожалуйста, почему записываю одно и тоже число, но получаю разный результат в базе.
GlobalHHNN: array of array of int64;
GlobalHHNN[i1,i2])=82217947977; хочу записать в базу это число

Form1.MyQuery1.ParamByName('hh_id').Asstring :=inttostr(GlobalHHNN[i1,i2]);
в базу записывается число 82217947977

Form1.MyQuery1.ParamByName('hh_id').AsInteger :=GlobalHHNN[i1,i2];
в базу записывается число 613569353


Сам код.

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


 Form1.MyQuery1.SQL.Text := 'INSERT INTO HH'
                     + '(hh_id)'
                     + 'VALUES'
                     + '(:hh_id)';
  Form1.MyQuery1.Prepare;
  if not Form1.MyConnection1.InTransaction then
    Form1.MyConnection1.StartTransaction;
  try
 for i1:=0 to 999 do begin
if GlobalHHNN[i1,0]<>0 then begin
for i2:=1 to GlobalHHNN[i1,0] do begin
      Form1.MyQuery1.ParamByName('hh_id').Asstring :=inttostr(GlobalHHNN[i1,i2]);
      Form1.MyQuery1.Execute;
end;
end;
end;
    Form1.MyConnection1.Commit;
  except
    Form1.MyConnection1.Rollback;
   raise;
  end;

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: В базу записывается не то число которое подставил

Сообщение AndreyZ » Чт 09 авг 2012 13:02

Это корректное поведение Delphi. При использовании свойства AsInteger, значение которое передается ему приводится к integer. Так как тип integer не может содержать значение 82217947977, оно урезается до допустимого значения типа integer. Следующий пример демонстрирует это:

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

procedure TForm1.Button1Click(Sender: TObject);
var
  i64: Int64;
  i: integer;
begin
  i64 := 82217947977;
  ShowMessage(IntToStr(i64)); // 82217947977
  i := i64;
  ShowMessage(IntToStr(i)); // 613569353
end;
Для решения проблемы, Вам следует использовать свойство AsLargeInt:

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

Form1.MyQuery1.ParamByName('hh_id').AsLargeInt := GlobalHHNN[i1,i2];

Sanya111
Сообщения: 26
Зарегистрирован: Пн 02 июл 2012 14:07

Re: В базу записывается не то число которое подставил

Сообщение Sanya111 » Чт 09 авг 2012 13:05

Спасибо большое, теперь все понятно!! :)

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: В базу записывается не то число которое подставил

Сообщение AndreyZ » Чт 09 авг 2012 13:11

Пожалуйста.

Закрыто