powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TFileStriam.Write BLOB различные результаты
23 сообщений из 23, страница 1 из 1
TFileStriam.Write BLOB различные результаты
    #39907541
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходные данные:
DELPHI 7, MSSQL2008 R2
файл грузится в блоб-поле и сохраняется в varbinary(MAX):
A) с клиента средствами ADO
Б) с mssql- сервера c помощью OPENROWSET

Результат:
сохраняем из varbinary(MAX) в блоб
например, так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
         myStream:TStream;
         fStream:TFileStream;
      ...
      begin
     ....
       myStream:=dsTemp.CreateBlobStream(dsTemp.FieldByName('FileValues'),bmRead);
       myStream.Position:=0;
       fStream.CopyFrom(myStream,myStream.Size);
       fStream.Write(fStream,fStream.Size);



и получаем:

из DELPHI
А) все хорошо
Б) Содержимое файла + такое же количество мусора приписанного после содержимого файла (как аски в юникод и получаем половину нужный файл целиком, половину мусора)

из MSSQL :
А) все хорошо
Б) все хорошо

CODPAGE на стороне mssql- сервера (OPENROWSET) на ситуацию не влияет.

Что характерно: размер на клиенте указан правильно, fStream.Size но жесточайше воспринимает как юникод или нечто подобное.

Чёт туплю: может кто сталкивался?

ps: можно, конечно, и через mssql выгрузить, но это не совсем то решение, которое хотелось бы
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907547
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
Код: pascal
1.
fStream.Write(fStream,fStream.Size);

Это что за хрень? Чего хотелось достичь?
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907548
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko,

а разве для записи не достаточно fStream.CopyFrom(myStream,myStream.Size); ? Зачем ещё fStream.Write(fStream,fStream.Size);
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907549
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45
Gerasimenko,

а разве для записи не достаточно fStream.CopyFrom(myStream,myStream.Size); ? Зачем ещё fStream.Write(fStream,fStream.Size);

Как пример. И так и так. Для чистоты эксперимента.
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907550
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
22047863
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907552
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
_Vasilisk_,
22047863

Вопрос, в какую сторону рыть: АДО или MSSQL
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907558
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
Как пример. И так и так. Для чистоты эксперимента.
Если у вас эксперимент подразумевает запись хрени, то почему вы удивляетесь, что записалась хрень?
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907563
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Gerasimenko
Как пример. И так и так. Для чистоты эксперимента.
Если у вас эксперимент подразумевает запись хрени, то почему вы удивляетесь, что записалась хрень?

Ок. Почему все же в первом случае хрень не воспринимается как хрень, а во втором воспринимается как хрень.
Сейчас танцую с бубнами и смотрю на размеры и т.д. Что попалось то и подставил в например . Суть не меняется.
В первом случае Хрень не Хрень. Во втором: хрень есть хрень
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907564
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
Ок. Почему все же в первом случае хрень не воспринимается как хрень, а во втором воспринимается как хрень.
Потому, что в первом случае вы вополняете копирование Stream, а во втором записываете произвольные fStream.Size байт, начиная с адреса @fStream

Я еще раз спрашиваю, чего хочется достичь?
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907565
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Gerasimenko
Ок. Почему все же в первом случае хрень не воспринимается как хрень, а во втором воспринимается как хрень.
Потому, что в первом случае вы вополняете копирование Stream, а во втором записываете произвольные fStream.Size байт, начиная с адреса @fStream

Я еще раз спрашиваю, чего хочется достичь?
щас гляну еще раз помутневшим глазом
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907578
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Gerasimenko
Код: pascal
1.
fStream.Write(fStream,fStream.Size);

Это что за хрень? Чего хотелось достичь?

Извините, не оттуда скопировалб очепятка осталась, я даже не заметил когда носом тыкнули, ибо погружен в другое:
Код: pascal
1.
fStream.Write(gTempFile, myStream.Size);


проблема осталась.

Проблема: в бинарном поле сидит инфа. АВ зависимости из какого приложения записана : воспринимается по разному.
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907585
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
Код: pascal
1.
fStream.Write(gTempFile, myStream.Size);

А теперь все угадываем, что же такое gTempFile
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907592
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Gerasimenko
Код: pascal
1.
fStream.Write(gTempFile, myStream.Size);

А теперь все угадываем, что же такое gTempFile

например: 'd:\temp\1.txt'
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907601
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenkoнапример: 'd:\temp\1.txt'

то есть ты из строковой константы пишешь мусор размером в myStream.Size. "Прэлеестно..." (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907602
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Щас: крыша едет... брейк аут.
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907611
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Gerasimenkoнапример: 'd:\temp\1.txt'

то есть ты из строковой константы пишешь мусор размером в myStream.Size. "Прэлеестно..." (с)


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  fStream:=TFileStream.Create(tmpFileName,fmCreate);
  dsTemp.CommandText:='Select FileValues '+
          ' from myTable '+
          ' where ... ';
 dsTemp.Open;
 myStream:=dsTemp.CreateBlobStream(dsTemp.FieldByName('FileValues'),bmRead);
 myStream.Position:=0;
 fStream.CopyFrom(myStream,myStream.Size);
 fStream.Write(fStream, myStream.Size);

 myStream.Free;
 fStream.Free;
 if Length(st_ext) > 0
  then ShellExecute(0,'Open',pchar(tmpFileName),nil,nil,1)
     else ShellExecute(Application.Handle, 'open', PChar('rundll32.exe'),
               PChar('shell32.dll,OpenAs_RunDLL ' + tmpFileName), nil, SW_SHOWNORMAL);

крыша реально едет, могу неадекватно отвечать. Вот это работает для одних бинарников и не работает для других
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907616
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дело не в BLOB, а в моей тупости и усталости.
Разберусь, напишу. если не забуду
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907620
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
Код: pascal
1.
 fStream.Write(fStream, myStream.Size);

Это работать не будет никогда
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907621
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Gerasimenko
Код: pascal
1.
 fStream.Write(fStream, myStream.Size);

Это работать не будет никогда
понял, спасибо
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907636
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GerasimenkoВот это работает для одних бинарников и не работает для других

Вот поэтому не надо тупо копипастить код с гугля. Половина строк в нём совершенно не
нужны, а вторая поражает воображение хацкерской извращённостью.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907640
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

GerasimenkoВот это работает для одних бинарников и не работает для других

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

Итого:
1) fStream.Write(fStream, myStream.Size); пишет хрень
2) Для файлов формата DOC, DOCX, mp3 и тп, видимо срабатывает защита от дураков. Там все срабатывает нормально и мусор отметается. (по размеру файла видно, но это не точно, и возможно кто более с этим работал подправят)
3) И, да... проверять надо, что и делал.

СПАСИБО ВСЕМ.
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907645
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В дополнение:
1) И fStream, и myStream могли бы быть нужны в особых случаях, каковых тут не наблюдается.
В данном случае достаточно одного вызова TBlobField.SaveToFile.
2) Запуск ассоциированной программы должен сопровождаться проверкой возвращаемой ошибки,
поскольку даже при наличии у файла расширения, оно может быть не ассоциировано.
3) Диалог "Open With" показывается либо штатной функцией API SHOpenWithDialog(), либо
вербой "openas", причём должен производиться и в случае получения
SE_ERR_NOASSOC/SE_ERR_ASSOCINCOMPLETE в пункте 2.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TFileStriam.Write BLOB различные результаты
    #39907652
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

В дополнение к п.2: открываются без проблем в своем формате. (не только размером проверялось)
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TFileStriam.Write BLOB различные результаты
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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