Загрузка/выгрузка произвольных файлов в MS SQL #541779


#0 by andrey153
Возникла задача для которой необходимо сохранять файлы в SQL-базу. Нашел такой вариант загрузки: INSERT INTO FTable(FContent) SELECT * FROM OPENROWSET(BULK 'E:myfile.bin', SINGLE_BLOB) as FContent а выгрузка так: exec master..xp_cmdshell 'bcp "SELECT FContent FROM DOPINFO.dbo.FTable" queryout E:myfile.bin -N -T' С загрузкой все хорошо, а вот при выгрузке bcp добавляет несколько байт в начало файла, да и вообще включать xp_cmdshell на SQL-сервере не очень хочется. Есть ли другой вариант получения файлов из MS SQL(2005)?
#1 by andrey153
Пытаюсь через ADO - не получается: RS = СоздатьОбъект("ADODB.Recordset"); Попытка    RS.Open("SELECT FContent FROM FTable", Connect);    RS.MoveFirst; Исключение    Сообщить(ОписаниеОшибки, "!");    Возврат; КонецПопытки;     Rec = СоздатьОбъект("ADODB.Record"); Stm = СоздатьОбъект("ADODB.Stream");     Rec.Open(RS); Stm.Open(Rec); Stm.SaveToFile("D:FileFromSQL.txt"); ----------- Ошибка: Rec.Open(RS); ADODB.Record: Объект или поставщик не может выполнить требуемую операцию.
#2 by andrey153
//еще вариант: Connect = "Provider=SQLOLEDB.1;Password=Pw); |Persist Security Info=True; |User ID=Login; |Initial Catalog=DBname; |Data Source=SvrName;     Rec = СоздатьОбъект("ADODB.Record"); Rec.Open("SELECT FContent FROM FTable", Connect, 1, 0); -------------- тогда ошибка: ADODB.Record: Операция не допускается в данном контексте
#3 by Snorkler
СтрПодключения = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=***;Password=***;Initial Catalog=ИмяБазы;Data Source=192.168.***.***;";    Connection = Новый COMОбъект("ADODB.Connection");    Connection.ConnectionString =  стрПодключения;    Попытка        Connection.Open;    Исключение        Сообщить ("Проблемы с подключением к базе" );    КонецПопытки;    //количество записей    Count = Новый COMОбъект("ADODB.Recordset");    Попытка        Count.Open("select count(*) from [ИмяБазы].[dbo].[ИмяТаблицы]", Connection );    Исключение        Сообщить ("Проблемы с выполнением запроса к базе");    КонецПопытки;    КоличествоСтрокSQL = Count.Fields.value; ______________________________________________ [ИмяБазы], [ИмяТаблицы] и [***] заменить на нужное.
#4 by andrey153
3, такой код работает
#5 by andrey153
только исходную задачу это не решает, почему-то Recordset открывается, а Record - нет
#6 by Snorkler
RS = Новый COMОбъект("ADODB.Recordset");    Попытка        RS.Open("Select * from [ИмяБазы].[dbo].[ИмяТаблицы]", Connection );    Исключение        Сообщить ("Проблемы с выполнением запроса к базе (записи)");    КонецПопытки;        Пока RS.EOF = 0 Цикл        ф = RS.Fields(НомерПоляВЗапросе).value;        ...        ...        ...        RS.MoveNext;    КонецЦикла; __________________________________ С вас, батенька, 4 руб. 12 коп.
#7 by andrey153
6, ф = RS.Fields(НомерПоляВЗапросе).value; так файл прочитать не удастся, к сожалению, так читаются только простые типы
#8 by andrey153
6, речь идет о сохранении бинарного файла в поле типа varbinary(MAX). И последующее чтение этого файла из SQL-базы
#9 by Snorkler
Значит, надо в базу по-другому записывать…  :0)
#10 by smaharbA
адодбстрим + шарк
#11 by andrey153
9, да в базу записывать я научился :) вот читать из нее пока не получается 10, можно пример? Не получается самому с ADODB.Stream разобраться...
#12 by andrey153
10, что такое "шарк"?
#13 by smaharbA
лениво, отосплюсь напишу
#14 by andrey153
13, хорошо, спасибо :)
#15 by Snorkler
Так я и говорю, а точно, что надо записывать бинарный файл на SQL? Может есть другие варианты?     :0) Найдется куча примеров…
#16 by andrey153
на VBScript заработал такой вариант: Connect = "Provider=SQLOLEDB.1;Password=***;Persist Security Info=True;User ID=***;Initial Catalog=***;Data Source=***" Set Rs = CreateObject("ADODB.Recordset")     set Stm = CreateObject("ADODB.Stream") Rs.Open "Select top 1 field2 from Table_2", Connect, 0, 3, 8 Stm.Type = 1 Stm.Open Stm.Write rs.Value Stm.Position = 0 Stm.SaveToFile("D:FileFromSQL.txt")
Тэги: Админ
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С