Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выгрузка image в винду  [new]
istoe
Member

Откуда:
Сообщений: 10
Необходимо выгрузить на жесткий диск фоты хранятся типом image.
След код создаёт нужный файл и даже размер нужный получается, но файл не читается.

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)

В чём может быть проблема ?
18 янв 10, 01:09    [8199569]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка image в винду  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35905
Ну, например, в том, что в image вовсе не image записан.
18 янв 10, 02:24    [8199621]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка image в винду  [new]
istoe
Member

Откуда:
Сообщений: 10
Через веб(на asp.net) всё ОК открывется
18 янв 10, 02:51    [8199629]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка image в винду  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35905
istoe
Через веб(на asp.net) всё ОК открывется
И вы на 100% уверены, что "веб(на asp.net)" работает так же, как bcp?
18 янв 10, 02:53    [8199630]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка image в винду  [new]
istoe
Member

Откуда:
Сообщений: 10
Гавриленко Сергей Алексеевич,

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

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

там никаких серьёзных преобразований нет

К сообщению приложен файл (handler.txt - 1Kb) cкачать
18 янв 10, 03:07    [8199635]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка image в винду  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4198
вот если бы ваш код также бы сохранял на диск, а потом читал из него тогда да, а так нет.
18 янв 10, 06:06    [8199669]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка image в винду  [new]
ART-CODE
Member

Откуда:
Сообщений: 1073
Через bcp не пробовал, я выгружал файлы из полей при помощи VBS
вот кусок срипта, из одного проекта... ( немножко подправил для публикации, но
после исправлений не тестил) - главное здесь общий смысл.
само сохранение идет в строке
if (Len(saveFile(StrSaveFileName,rst.fields("File_Data").GetChunk(rst.fields("File_Size").Value)))=0)
При желании скрипт можно вызывать из планировщика задач Win. или другой программы, или из триггера в самой базе данных при помощи sp_OAMethod


'----------------------------------------------------------------------'
' скрипт обеспечивает выгрузку файлов из базы 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

18 янв 10, 10:29    [8200249]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка image в винду  [new]
Glory
Member

Откуда:
Сообщений: 104764
istoe
Гавриленко Сергей Алексеевич,

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

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

там никаких серьёзных преобразований нет

Вы уверены, что созданный утилитой bcp файл и считанный вашим кодом поток данных совпадают от первого до последнего байта ?
18 янв 10, 10:40    [8200320]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка image в винду  [new]
iljy
Member

Откуда:
Сообщений: 8711
Glory
istoe
Гавриленко Сергей Алексеевич,

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

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

там никаких серьёзных преобразований нет

Вы уверены, что созданный утилитой bcp файл и считанный вашим кодом поток данных совпадают от первого до последнего байта ?

+1. Не так давно был топик, в котором автор бурно возмущался по поводу того, что BCP при выгрузке одиночных объектов в файл что-то в начале дописывает, по-моему он выгружал XML, но думаю это вид сбоку.
18 янв 10, 10:48    [8200388]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка image в винду  [new]
istoe
Member

Откуда:
Сообщений: 10
ART-CODE, Огромное спасибо! всё удалось

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

подлый bcp дописал их в начало файла
без них всё открывается.
18 янв 10, 12:04    [8201069]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка image в винду  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
bcp рулит, не нужно тут разглагольствовать! :)

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

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

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

через шелл:

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

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 будет являться схемой (провайдером) выгрузки. Вот и вся недолгая.
18 янв 10, 22:02    [8205217]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка image в винду  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Ну, получилось или нет?
19 янв 10, 12:28    [8207633]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка image в винду  [new]
istoe
Member

Откуда:
Сообщений: 10
МСУ , Спасибо за разъяснения!

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

bcp рулит :)
25 янв 10, 18:07    [8242745]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Выгрузка image в винду  [new]
foxship
Member

Откуда:
Сообщений: 266
Здравствуйте всем.

Я вот то же самое делаю как тут описано, но у меня выгружается пустой файл jpg
4 янв 19, 11:32    [21778295]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить