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

Откуда: СПб
Сообщений: 1062
Добрый день.
SQL 2008 R2 и FileStream.
Клиентское приложение 1С 8.2, блин. Поэтому пока все кайфушки FileStream непонятно как использовать.
Использую ADODB.Recordset, ADODB.Stream. Запись FileStream полей традиционными update/insert. При записи файла размером 1M в поле varbinary(max) сетевой трафик over 4M. (1M преобразуется в строку hex при передаче на сервер). Это грустно: в 4-ре раза больше чем могло бы быть.
Вопрос существует ли какая-нибудь COM-обертка для записи в SQL FileStream (ну, например, для класса System.Data.SqlTypes.SqlFileStream .Net) средствами Windows API?
21 дек 13, 14:51    [15327491]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по реализации FileStream SQL 2008R2  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
VladimirKr
При записи файла размером 1M в поле varbinary(max) сетевой трафик over 4M. (1M преобразуется в строку hex при передаче на сервер)
Странно как то. Не должно вроде передаваться как hex, к тому же при этом должно быть 2-х кратное увеличение, а не 4-х.
21 дек 13, 15:16    [15327574]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по реализации FileStream SQL 2008R2  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
alexeyvg
Не должно вроде передаваться как hex, к тому же при этом должно быть 2-х кратное увеличение, а не 4-х.
Ну если под "традиционными update/insert" понимается динамическое формирование текста запроса без использования параметров, да еще плюс юникод, то и будет 4-х кратное увеличение.
21 дек 13, 15:28    [15327598]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по реализации FileStream SQL 2008R2  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1062
alexeyvg
VladimirKr
При записи файла размером 1M в поле varbinary(max) сетевой трафик over 4M. (1M преобразуется в строку hex при передаче на сервер)
Странно как то. Не должно вроде передаваться как hex.

Участок 1С говнокода:
	Rs.Fields("NativeFname").Value=ИмяФайла;
	Если Stream<>Неопределено Тогда
		Rs.Fields("Picture").Value=Stream.Read(-1);
	Иначе
		Rs.Fields("Picture").Value=Rs.Fields("DbNull").Value;
	КонецЕсли;
	Попытка
		Rs.Update();

В профайлере выглядит так:
exec sp_executesql N'UPDATE "FileStore"."dbo"."Pictures" SET "NativeFname"=@P1,"Picture"=@P2 WHERE "NativeFname"=@P3 AND "Id"=@P4',N'@P1 nvarchar(300),@P2 image,@P3 nvarchar(300),@P4 uniqueidentifier',N'GebgartDriveLic.jpg',0xFFD8FFE000104A46494600010101007800780000.....

Параметр @P2 представляет собой 16-ричный дамп несчастного файла. Вся эта строка топает на SQL-сервер.
alexeyvg
к тому же при этом должно быть 2-х кратное увеличение, а не 4-х.

invm
Ну если под "традиционными update/insert" понимается динамическое формирование текста запроса без использования параметров, да еще плюс юникод, то и будет 4-х кратное увеличение.

Ну, может 2-кратное, если передача не в юникоде. А в какой кодировке ADODB передает, неужели не юникод?
И, может я чего-то не понимаю, но если, допустим, использовать ADODB.Command.Execute обернув update в хранимую процедуру, то в профайлере будет что-то типа:
exec spМояПроцедура  ...,@MoйVarBinaryMax=0xFFD8FFE000104A46494600010101007800780000....

то есть вид сбоку.
Неужели существует возможность передать на сервер varbinary в "сыром" виде? Это очень не вяжется с моей картиной мира. ???
21 дек 13, 16:58    [15327747]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по реализации FileStream SQL 2008R2  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
VladimirKr
И, может я чего-то не понимаю, но если, допустим, использовать ADODB.Command.Execute обернув update в хранимую процедуру, то в профайлере будет что-то типа:
exec spМояПроцедура  ...,@MoйVarBinaryMax=0xFFD8FFE000104A46494600010101007800780000....
Мда, получается, при вызове процедур параметры передаёт строкой, несмотря на использование параметров с правильными типами? :-(
VladimirKr
Неужели существует возможность передать на сервер varbinary в "сыром" виде?
Можно попробовать через какие нибуть датаадаптеры... Хотя это конечно неудобно.
22 дек 13, 01:29    [15329026]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по реализации FileStream SQL 2008R2  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1062
alexeyvg
Можно попробовать через какие нибуть датаадаптеры... Хотя это конечно неудобно.

Ну, работу датаадаптера в профайлере я видел неоднократно: строка execute/sp_execute.
Да и как по другому, если существует либо update/insert/merge, либо exec процедуры с (update/insert/merge). Других обращений к серверу для выполнения команд записи я не знаю и не встречал.
ЗЫ.
Еслии бы из АдынС можно было работать с датаадаптерами, то уж и не было бы вопроса: Рабоотал бы с System.Data.SqlTypes.SqlFileStream
22 дек 13, 10:23    [15329363]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по реализации FileStream SQL 2008R2  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
VladimirKr
Да и как по другому, если существует либо update/insert/merge, либо exec процедуры с (update/insert/merge). Других обращений к серверу для выполнения команд записи я не знаю и не встречал.
У меня большой объём заливается через SqlBulkCopy. Но не знаю, можно ли эо использовать с FileStream
VladimirKr
Еслии бы из АдынС можно было работать с датаадаптерами, то уж и не было бы вопроса: Рабоотал бы с System.Data.SqlTypes.SqlFileStream
А какие средства вообще доступны из 1С?
22 дек 13, 15:02    [15329796]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по реализации FileStream SQL 2008R2  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1062
alexeyvg,
COM - IDispatch, и в принципе, вызовы dll - можно вызвать Win API, в т. ч. ::SqlFileStreamOpen, но блин, очень плохо документировано, и вообще, похоже на забивание кривых гвоздей херовым микроскопом.
22 дек 13, 15:47    [15329925]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить