Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Ну, например, в том, что в image вовсе не image записан. |
18 янв 10, 02:24 [8199621] Ответить | Цитировать Сообщить модератору |
istoe Member Откуда: Сообщений: 10 |
Через веб(на asp.net) всё ОК открывется |
18 янв 10, 02:51 [8199629] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
|
||
18 янв 10, 02:53 [8199630] Ответить | Цитировать Сообщить модератору |
istoe Member Откуда: Сообщений: 10 |
Гавриленко Сергей Алексеевич, Конечно не уверен. Я не эксперт. Если интересно, В вложение код из веб интерфейса, который открывает фото. там никаких серьёзных преобразований нет К сообщению приложен файл (handler.txt - 1Kb) cкачать ![]() |
18 янв 10, 03:07 [8199635] Ответить | Цитировать Сообщить модератору |
Lepsik Member Откуда: glubinka Сообщений: 4256 |
вот если бы ваш код также бы сохранял на диск, а потом читал из него тогда да, а так нет. |
18 янв 10, 06:06 [8199669] Ответить | Цитировать Сообщить модератору |
ART-CODE Member Откуда: Сообщений: 1092 |
Через 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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вы уверены, что созданный утилитой bcp файл и считанный вашим кодом поток данных совпадают от первого до последнего байта ? |
||
18 янв 10, 10:40 [8200320] Ответить | Цитировать Сообщить модератору |
iljy Member Откуда: Сообщений: 8711 |
+1. Не так давно был топик, в котором автор бурно возмущался по поводу того, что BCP при выгрузке одиночных объектов в файл что-то в начале дописывает, по-моему он выгружал XML, но думаю это вид сбоку. |
||||
18 янв 10, 10:48 [8200388] Ответить | Цитировать Сообщить модератору |
istoe Member Откуда: Сообщений: 10 |
ART-CODE, Огромное спасибо! всё удалось Glory , Вы правы. Не заметил расхождения в 4 байта подлый bcp дописал их в начало файла без них всё открывается. |
18 янв 10, 12:04 [8201069] Ответить | Цитировать Сообщить модератору |
МСУ 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] Ответить | Цитировать Сообщить модератору |
МСУ Member [заблокирован] Откуда: http://codearticles.ru Сообщений: 31089 |
Ну, получилось или нет? |
19 янв 10, 12:28 [8207633] Ответить | Цитировать Сообщить модератору |
istoe Member Откуда: Сообщений: 10 |
МСУ , Спасибо за разъяснения! Выгрузка работает. bcp рулит :) |
25 янв 10, 18:07 [8242745] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
foxship Member Откуда: Сообщений: 267 |
Здравствуйте всем. Я вот то же самое делаю как тут описано, но у меня выгружается пустой файл jpg |
4 янв 19, 11:32 [21778295] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |