powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выгрузка image в винду
14 сообщений из 14, страница 1 из 1
Выгрузка image в винду
    #36415049
istoe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо выгрузить на жесткий диск фоты хранятся типом image.
След код создаёт нужный файл и даже размер нужный получается, но файл не читается.

Код: plaintext
1.
2.
3.
declare  @Str varchar( 8000 )
      set @Str='exec master..xp_cmdshell ''bcp "SELECT top 1 filedata FROM [pessdb].dbo.[Photos]"   
       queryout c:\2.jpg -N -T'', no_output'
exec(@Str)

В чём может быть проблема ?
...
Рейтинг: 0 / 0
Выгрузка image в винду
    #36415079
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, например, в том, что в image вовсе не image записан.
...
Рейтинг: 0 / 0
Выгрузка image в винду
    #36415083
istoe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Через веб(на asp.net) всё ОК открывется
...
Рейтинг: 0 / 0
Выгрузка image в винду
    #36415084
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
istoeЧерез веб(на asp.net) всё ОК открыветсяИ вы на 100% уверены, что "веб(на asp.net)" работает так же, как bcp?
...
Рейтинг: 0 / 0
Выгрузка image в винду
    #36415088
istoe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,

Конечно не уверен.
Я не эксперт.

Если интересно, В вложение код из веб интерфейса, который открывает фото.

там никаких серьёзных преобразований нет
...
Рейтинг: 0 / 0
Выгрузка image в винду
    #36415111
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот если бы ваш код также бы сохранял на диск, а потом читал из него тогда да, а так нет.
...
Рейтинг: 0 / 0
Выгрузка image в винду
    #36415323
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через bcp не пробовал, я выгружал файлы из полей при помощи VBS
вот кусок срипта, из одного проекта... ( немножко подправил для публикации, но
после исправлений не тестил) - главное здесь общий смысл.
само сохранение идет в строке
Код: plaintext
1.
if (Len(saveFile(StrSaveFileName,rst.fields("File_Data").GetChunk(rst.fields("File_Size").Value)))= 0 )
При желании скрипт можно вызывать из планировщика задач Win. или другой программы, или из триггера в самой базе данных при помощи sp_OAMethod


Код: plaintext
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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
'----------------------------------------------------------------------'
' скрипт обеспечивает выгрузку файлов из базы File_IMAGE'
'----------------------------------------------------------------------'
Dim fso,c,rst, StrConnection, StrQuery,StrSaveFileName, StrLogFileName 'глобальные переменные и обьекты'

Const adOpen =  3  
IntRoute =  0 
StrRoute= ""
Set fso  = CreateObject ("Scripting.FileSystemObject")
Set c = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")

StrConnection="Application Name=Unload_File.vbs;Provider=SQLOLEDB.1;Password=PASSVORD;Persist Security Info=True;User ID=USER;Initial Catalog=File_IMAGE;Data Source=127.0.0.1,1433"
StrQuery="select [File_Data], [File_Name] , [File_Size] from File_IMAGE.dbo.t_files where [File_Name] like '%Вася%.jpg'"
StrLogFileName="C:\Image\Unload_File.log"

ScriptMain  ' точка входа скрипта'

Set fso = Nothing
Set rst = Nothing
Set c = Nothing
'----------------------------------------------------------------------'
Sub ScriptMain()
    on error resume next
log (" --- start ---")

    c.CursorLocation =  3 
    c.ConnectionString = StrConnection
    c.Open  
      
  if err.number then
       log ("ScriptMain. Ошибка при попытке подключения к базе данных: "&err.description & " (" & err.number & ")")
       exit sub
  end if 
  
  rst.Open StrQuery, c, adOpen
  
  if err.number then
       log ("ScriptMain. Ошибка при попытке получения списка файлов для выгрузки: "&err.description & " (" & err.number & ")")
       exit sub
  end if   
   
  If  (rst.EOF) Then 
	 log ("ScriptMain. Файлов для выгрузки: 0")
	 exit sub
  end if
  
 rst.MoveFirst
  
 Do While Not (rst.EOF)  

    
StrSaveFileName="C:\Image\"&rst.fields("File_Name").Value
 
    
    if fso.FileExists(StrSaveFileName) then  '- зачистка перед сохранением'
      fso.DeleteFile(StrSaveFileName)
     Log("Удален файл: "&StrSaveFileName&" (зачистка перед сохранением)")  
    end if    
    
        if (Len(saveFile(StrSaveFileName,rst.fields("File_Data").GetChunk(rst.fields("File_Size").Value)))= 0 )then
Log("Не удалось выгрузить файл: "&StrSaveFileName&", Size="&CStr(rst.fields("File_Size").Value)) 
	else
Log("Выгружен файл: "&StrSaveFileName&", Size="&CStr(rst.fields("File_Size").Value)) 
        end if

    
    rst.MoveNext
    Loop   

log ("End")
End sub


'-------------------------------------------------------------------------'
function saveFile(filename,File_Data)
  on error resume next
  Dim RetStr
  RetStr=filename
     set adodbStream = CreateObject("ADODB" & "." & "Stream")
     adodbStream.Type=  1 
     adodbStream.Open
     adodbStream.write File_Data     

     adodbStream.SaveToFile filename, 2        
     
     if err.number then
       log ("saveFile. Ошибка при попытке сохранить данные в файл: "&filename&" "&err.description & " (" & err.number & ")")
        RetStr=""
     end if 
     
     adodbStream.Close
    saveFile=RetStr
end function
'-------------------------------------------------------------------------'
Sub log(sData)  ' запись логов'
    Dim ts, ForAppending
    ForAppending =  8 
    Set ts = fso.OpenTextFile(StrLogFileName, ForAppending, True)
    ts.Write Date & " - "& Time() & " " & sData & chr( 13 ) & chr( 10 )
    ts.Close
End Sub
'-------------------------------------------------------------------------'
Function fixed_len(i, l)
  fixed_len = String(l - Len(FormatNumber(i,  0 , , , False)), "0") & FormatNumber(i,  0 , , , False)
End Function

...
Рейтинг: 0 / 0
Выгрузка image в винду
    #36415341
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
istoeГавриленко Сергей Алексеевич,

Конечно не уверен.
Я не эксперт.

Если интересно, В вложение код из веб интерфейса, который открывает фото.

там никаких серьёзных преобразований нет
Вы уверены, что созданный утилитой bcp файл и считанный вашим кодом поток данных совпадают от первого до последнего байта ?
...
Рейтинг: 0 / 0
Выгрузка image в винду
    #36415367
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GloryistoeГавриленко Сергей Алексеевич,

Конечно не уверен.
Я не эксперт.

Если интересно, В вложение код из веб интерфейса, который открывает фото.

там никаких серьёзных преобразований нет
Вы уверены, что созданный утилитой bcp файл и считанный вашим кодом поток данных совпадают от первого до последнего байта ?
+1. Не так давно был топик, в котором автор бурно возмущался по поводу того, что BCP при выгрузке одиночных объектов в файл что-то в начале дописывает, по-моему он выгружал XML, но думаю это вид сбоку.
...
Рейтинг: 0 / 0
Выгрузка image в винду
    #36415540
istoe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ART-CODE, Огромное спасибо! всё удалось

Glory , Вы правы. Не заметил расхождения в 4 байта

подлый bcp дописал их в начало файла
без них всё открывается.
...
Рейтинг: 0 / 0
Выгрузка image в винду
    #36416898
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bcp рулит, не нужно тут разглагольствовать! :)

Накидал пошаговый пример:

1. есть таблица t с полем F типа varbinary(max)
Код: plaintext
select * from t

2. создаем файл PP.fmt

через шелл:

Код: plaintext
bcp baseName.dbo.t format nul -T -n -f c:\PP.fmt

получиться файл с строчкой:
1 SQLBINARY 8 0 "" 1 F ""


изменяем на
1 SQLBINARY 0 0 "" 1 F ""
и удаляем лишние подобные строки с типами.

3. Записываем данные из поля таблицы в файл imagename.jpg

Код: plaintext
1.
2.
3.
declare @SQLcommand nvarchar( 100 )
set @SQLcommand = N'bcp "SELECT F FROM dnn_r..t" queryout C:\imagename.jpg -T -fC:\PP.fmt'
exec xp_cmdshell @SQLcommand
go

P.S. Этот файл PP.fmt будет являться схемой (провайдером) выгрузки. Вот и вся недолгая.
...
Рейтинг: 0 / 0
Выгрузка image в винду
    #36417730
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, получилось или нет?
...
Рейтинг: 0 / 0
Выгрузка image в винду
    #36429862
istoe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУ , Спасибо за разъяснения!

Выгрузка работает.

bcp рулит :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Выгрузка image в винду
    #39755812
foxship
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте всем.

Я вот то же самое делаю как тут описано, но у меня выгружается пустой файл jpg
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выгрузка image в винду
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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