Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
тип image
|
|||
|---|---|---|---|
|
#18+
Привет! Помогите кто может! Есть таблица в которой хранятся бинарные данные в поле типа image Записываю в него данные из массива примерно следующим образом: rs("opis").AppendChunk abBytes() rs.Update При этом если размер массива больше 2^16 то выдаётся ошибка [Microsoft][ODBC SQL Server Driver][SQL Server] Length of text, ntext, or image data(<размер массива> to be replicated exceeds configured maximum 65536 почему??????? заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2002, 06:10 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
>> почему??????? Наверное, потому что - ODBC-драйвер не "бездонная бочка"... (он же честно признается, что сконфигурирован принимать не более 64К за 1 раз). Вариантов решения сразу видится 3: 1. Переконфигурить ODBC-драйвер... (не знаю даже - где искать информацию о том, как это сделать). 2. Разбить ваш массив на порции и загружать его через AppendChunk в цикле, пока все порции не загрузятся... Примерно так: \nlngOffset = 0 ' Reset offset. Do While lngOffset < lngLogoSize varChunk = LeftB(RightB(varLogo, lngLogoSize - lngOffset), _ conChunkSize) rstPubInfo!logo.AppendChunk varChunk lngOffset = lngOffset + conChunkSize ' <- Это, наверное, и есть - пресловутые 64К, (для верности можно задать меньше) Loop rstPubInfo.Update 3. Вместо "устаревшего" AppendChunk - использовать "новомодное" Stream ... см. http://support.microsoft.com/default.aspx?scid=kb;RU;q258038 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2002, 08:01 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
первый вариант не пробовала, но по поводу остальных - то же самое.. в рекордсет-то данные добавляются нормально, в любом количестве, а ошибка происходит на этапе rs.Update ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2002, 11:48 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
Лично я в таких ситуациях пользуюсь хранимыми процедурами. И никаких проблем нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2002, 12:52 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
а есть хоть какой-нить примерчик? была бы очень благодарна а то времени мало ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2002, 13:35 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
CREATE PROCEDURE Tst @img image AS INSERT INTO tbl (img) VALUES(@img) В самом примитивном виде так. CREATE PROCEDURE Tst @img image AS BEGIN DECLARE @ptrval varbinary(16) INSERT INTO tbl (img) VALUES('xxx') SELECT @ptrval = TEXTPTR(img) WRITETEXT tbl.pr_info @ptrval @img END ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2002, 14:03 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
CREATE PROCEDURE Tst @img image AS INSERT INTO tbl (img) VALUES(@img) В самом примитивном виде так. CREATE PROCEDURE Tst @img image AS BEGIN DECLARE @ptrval varbinary(16) INSERT INTO tbl (img) VALUES('xxx') SELECT @ptrval = TEXTPTR(img) WRITETEXT tbl.img @ptrval @img END Вроде так. Хотя мог и ошибиться - писал "пробегая мимо компьютера" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2002, 14:04 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
Привет! Тоже уже 4-й день бьюсь над этой проблемой. Я исп. хранимые процедуры. Но толку от них мало, потому что им ведь надо передать переменную @image размером больше 64K!!! ODBC этого делать не хочет Считаю единственным выходом сконфигурить этот ODBC. Но как это сделать не знаю... пока. Во всяком случае QueryAnalyzer это делать умеет (там есть соотв. вкладка свойств подключения), значит хотя бы теор. это сделать можно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2002, 07:52 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
Это опять я. Только что у меня всё получилось. Я сменил провайдера: вместо MS OLE DB Provider for ODBC Driver исп. MS OLE DB Provider for SQL Server. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2002, 08:22 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
Привет! А это опять я. А где его менять? Вообще как лучше подключаться к базе в данном случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2002, 05:13 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
Привет, Ксения! В данном случае я исп. Delphi, компоненты вкладки ADO. Там есть компонент ADOConnection а у него свойство ConnectionString. Этой строчки передаются все параметры подключения к БД. Так вот вместо OLE DB for ODBC ставишь OLE DB for SQL Server. И вроде всё более менее хорошо работает. Если ты исп. не Delphi, то это не беда (а может и преимущество ). Чего-то подобное есть и в басике и в с++ (всё это относится к ADO). P.S. С наступающим! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2002, 08:23 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
Привет, Денис! Странно, я и так использую ADO и OLE DB for SQL Server... И всё равно не катит Только у меня VB А с ХП точно ничего не получается, можно и не пробовать? P.S. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2002, 09:38 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
а никто не пробовал работать только с хранимыми процедурами, передавая в качестве параметра смещение и сколько прочитать (записать)? CREATE PROCEDURE Tst @pk_id int, @offset int, @size int AS BEGIN DECLARE @ptrval varbinary(16) INSERT INTO tbl (img) VALUES('xxx') SELECT @ptrval = TEXTPTR(img) READTEXT tbl.pr_info @ptrval @offset @size END Но вот проблема, создаю ADODB.Command объект, заполняю параметры, все как обычно. А как в VB получить adVarLongBinary данные? Мне нужна нек-я структура в памяти. Что-то типа set rs = cmd.Execute? При этом rs.fields(0).value всегда выдает '??'. Похоже какой-то указатель, но почему одно и то же значение? Попробовал идею из http://support.microsoft.com/default.aspx?scid=kb;RU;q258038 Вариант byteArray(i) = ado_stream.Read(1) не проходит, ругается на несоответствие типов В QA все работает правильно (записывается в любое место, читается и правильно отображается). PS: не хотелось бы работать с rs, поскольку заводить его ради одного (пускай большого)значения не правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2002, 02:42 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
вот так оно на самом деле CREATE PROCEDURE Tst @pk_id int, @offset int, @size int AS BEGIN DECLARE @ptrval varbinary(16) SELECT @ptrval = TEXTPTR(img) from tabl where PKID = @pk_id READTEXT tbl.pr_info @ptrval @offset @size END ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2002, 03:34 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
kseniya, можно попробовать перед открытием рекордсета в той же сессии послать на сервер "SET TEXTSIZE 2147483647". Это должно заставить провайдера увеличить свой буфер под блоб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2002, 05:22 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
2 Dankov (для сведения) Цитатка из BOL: The SQL Server ODBC driver and Microsoft OLE DB Provider for SQL Server automatically set TEXTSIZE to 2147483647 when connecting. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2002, 06:17 |
|
||
|
тип image
|
|||
|---|---|---|---|
|
#18+
Я НАШЕЛ! Надо обновить MDAC до 2.7, тогда появляется возможность возвращать результат запроса в поток. делаем так private function F... (PKID_value As Long, Offset_value As Long, Size_value As Long) as ADODB.Stream Dim param_Return As ADODB.Parameter Dim param_in_PKID As ADODB.Parameter Dim param_in_OFFSET As ADODB.Parameter Dim param_in_SIZE As ADODB.Parameter Dim cmd As ADODB.Command Dim AdoStream As ADODB.Stream Set AdoStream = New ADODB.Stream AdoStream.Open Set cmd = New ADODB.Command With cmd .ActiveConnection = NBC .CommandType = adCmdStoredProc .CommandText = "sp_get_......" .Properties("Output Stream") = AdoStream End With Set param_in_PKID = cmd.CreateParameter With param_in_PKID .Direction = adParamInput .Name = "in_PKID" .Type = adInteger .Size = 1 .Value = PKID_value End With Set param_in_OFFSET = cmd.CreateParameter With param_in_OFFSET .Direction = adParamInput .Name = "in_OFFSET" .Type = adInteger .Size = 1 .Value = Offset_value End With Set param_in_SIZE = cmd.CreateParameter With param_in_SIZE .Direction = adParamInput .Name = "in_SIZE" .Type = adInteger .Size = 1 .Value = Size_value End With Set param_Return = cmd.CreateParameter With param_Return .Direction = adParamReturnValue .Type = adInteger .Name = "Return" End With With cmd .Parameters.Append param_Return .Parameters.Append param_in_PKID .Parameters.Append param_in_OFFSET .Parameters.Append param_in_SIZE .Execute , , adExecuteStream End With F= AdoStream на стороне сервера обычная процедура один в один из MSDN SELECT @prt_val= TEXTPTR(tbl_.БЛОБ) FROM tbl_ where tbl_.PKID =@pk_id READTEXT tbl_.БЛОБ @prt_val @offset @size Максимальный размер записываемого (считываемого) блока не проверял, поскольку мои данные - числа и 1024 байта на блок мне хватает с избытком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2002, 02:09 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32024625&tid=1822905]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 334ms |

| 0 / 0 |
