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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2012, 04:02   #1
Skail
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 18
По умолчанию Записать в базу данных шестнадцатеричную переменную

Привет всем. Вопрос. Записываю в базу данных SQL Server в поле типа binary(50) переменную равную r.intv2 := $FFFF;. В базу значение записывается равное 0x8E0014000000FFFF00000000...., от куда берутся первые шесть байт и как мне их убрать. Код программы:
Код:
var
  Form1: TForm1;

 type
  TTest = packed record
    intv2 : integer;

end;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var dp : TParameter;
    ms : TMemoryStream;
    r : TTest;
begin
    r.intv2 := $FFFF;

    ADOQuery1.SQL.Text := 'INSERT INTO qwe(qwe) VALUES (:qwe)';
    dp := ADOQuery1.Parameters.ParamByName('qwe');

    ms := TMemoryStream.Create();
    ms.Write(r, sizeof(r));
    dp.LoadFromStream(ms, ftBlob);

    ADOQuery1.ExecSQL();
end;
Может кто подскажет более правильное решение....
Skail вне форума Ответить с цитированием
Старый 12.09.2012, 07:02   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Заменить тип поля binary на varbinary.
И можно обойтись без BLOB.
Код:
//запись
procedure TForm1.Button1Click(Sender: TObject);
var
  r : TTest;
  Ch : array of Byte;
begin
  r.intv2 := $FFFF;
  SetLength(Ch, SizeOf(r.Intv2));
  Move(r.intv2, Ch[0], SizeOf(r.intv2));

  ADOQuery1.SQL.Text := 'insert into Tbl1 (qwe) values (:qwe)';
  ADOQuery1.Prepared := True;
  if ADOQuery1.Parameters.Count = 0 then
    ADOQuery1.Parameters.Add;
  ADOQuery1.Parameters[0].DataType := ftVarBytes;
  ADOQuery1.Parameters[0].Value := Ch;
  ADOQuery1.ExecSQL;
end;

//чтение
procedure TForm1.Button2Click(Sender: TObject);
var
  r : TTest;
  Ch : TBytes; //проверено в D2010
//  Ch : array of Byte; для D7
begin
  ADOQuery1.SQL.Text := 'select * from Tbl1'; //+where;
  ADOQuery1.Open;
  if not ADOQuery1.Eof then begin
    Ch := ADOQuery1.FieldByName('qwe').AsBytes; //проверено в D2010
//    Ch := ADOQuery1.FieldByName('qwe').Value; для D7
    if Length(Ch) > 0 then begin
      Move(Ch[0], r.intv2, Length(Ch));
    end;
  end;
  ADOQuery1.Close;
end;
Проверка на наличие параметров (if ADOQuery1.Parameters.Count = 0 then) нужна, если компонент используется для записи и чтения.

P.S. Только зачем записывать обычное число в тип binary? Не видно разумного обоснования.

Последний раз редактировалось Прик; 12.09.2012 в 07:10. Причина: варианты для разных версий Дельфи
Прик вне форума Ответить с цитированием
Старый 12.09.2012, 11:02   #3
Skail
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 18
По умолчанию

Спасибо Прик, помог очень
Skail вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
отследить переменную и вбить в базу m1zantrop Общие вопросы Delphi 3 07.06.2012 15:29
Записать в переменную значение backgroundImage (jquery) 4e4en JavaScript, Ajax 4 30.09.2010 10:24
Как записать в переменную delphi результат sql запроса? mar4elo БД в Delphi 1 03.12.2009 16:59
Как записать каждое число в отдельности в переменную Xcopy Общие вопросы Delphi 12 01.12.2009 17:12
Как записать в переменную содержимое RichEdit? nusik Общие вопросы C/C++ 1 12.06.2009 09:12