powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сохранение бинарных данных
2 сообщений из 52, страница 3 из 3
Сохранение бинарных данных
    #39718807
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам_Vasilisk_> На TIBSQL задача решается.
С правками или без?Без. Но с потенциальными граблями

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
  IBSQL2.ParamByName('Data').AsBytes := LData;
........
procedure TIBXSQLVAR.SetAsBytes(const Value: TBytes);
var
  ss : TBytesStream;
begin
  if (FXSQLVAR.SqlDef = SQL_BLOB) then
  begin
    ss := TBytesStream.Create(Value);
    try
      LoadFromStream(ss);
    finally
      ss.Free;
    end;
  end
  else
    AsString := StringOf(Value);
end;

function StringOf(const Bytes: TBytes): UnicodeString;
begin
  if Assigned(Bytes) then
    Result := TEncoding.Default.GetString(Bytes, Low(Bytes), High(Bytes) + 1)
  else
    Result := '';
end;

procedure TIBXSQLVAR.SetAsString(const Value: String);
begin
  SetAsCPString(Value, FSQL.Database.CharacterSetCodePage); // AnsiString
end;

procedure TIBXSQLVAR.SetAsCPString(const Value: String; CodePage : Integer);
begin
  ........
  if (stype = SQL_TEXT) or (stype = SQL_VARYING) then
  begin
    if CodePage <> 0 then
    begin
      Encoding := TMBCSEncoding.Create(CodePage);
      try
        bt := Encoding.GetBytes(Value);
        SetStringValue;
      finally
        Encoding.Free;
      end;
    end
end;

Т.е. вначале массив байт конвертируется в юникодную строку на основании текущей кодировки системы, а потом полученная строка конвертируется обратно в массив байт, но уже на основании кодировки базы. Т.е. может и не совпасть.

С другой стороны, никто не мешает сделать так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
  LData: TBytes;
  LVar: TSQLVAR;
begin
  .....
  LVar := IBSQL2.ParamByName('Data').Data;
  LVar.SqlType := SQL_TEXT or (LVar.sqltype and 1);
  LVar.sqllen := Length(LData);
  LVar.SetDataSize(0, LVar.sqllen + 1);
  Move(LData[0], LVar.sqldata^, LVar.sqllen);
  IBSQL2.ParamByName('Data').Modified := True;

обернув все в хелпер и добавив проверки по вкусу

Симонов Денисбыстро сдался.Работу работать нужно
DimonkaА какой нибудь энкодинг совсем не предлагать? 21702895

КотовасияВ фиб+ все работает.Я даже больше скажу - в FireDAC все работает
...
Рейтинг: 0 / 0
Сохранение бинарных данных
    #39718818
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17.10.2018 14:28, _Vasilisk_ пишет:
> в FireDAC все работает

ну дык он не на пустом месте писался ;)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
2 сообщений из 52, страница 3 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сохранение бинарных данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]