powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / тип image
17 сообщений из 17, страница 1 из 1
тип image
    #32024345
kseniya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
Помогите кто может!
Есть таблица в которой хранятся бинарные данные в поле типа image
Записываю в него данные из массива примерно следующим образом:

rs("opis").AppendChunk abBytes()

rs.Update

При этом если размер массива больше 2^16 то выдаётся ошибка [Microsoft][ODBC SQL Server Driver][SQL Server] Length of text, ntext, or image data(<размер массива&gt to be replicated exceeds configured maximum 65536

почему???????

заранее спасибо!
...
Рейтинг: 0 / 0
тип image
    #32024364
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> почему???????

Наверное, потому что - 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
...
Рейтинг: 0 / 0
тип image
    #32024402
kseniya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
первый вариант не пробовала, но по поводу остальных - то же самое..
в рекордсет-то данные добавляются нормально, в любом количестве, а ошибка происходит на этапе rs.Update
...
Рейтинг: 0 / 0
тип image
    #32024413
Tabloid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лично я в таких ситуациях пользуюсь хранимыми процедурами. И никаких проблем нет.
...
Рейтинг: 0 / 0
тип image
    #32024426
kseniya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а есть хоть какой-нить примерчик? была бы очень благодарна
а то времени мало
...
Рейтинг: 0 / 0
тип image
    #32024429
Tabloid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
тип image
    #32024430
Tabloid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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

Вроде так. Хотя мог и ошибиться - писал "пробегая мимо компьютера"
...
Рейтинг: 0 / 0
тип image
    #32024494
Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
Тоже уже 4-й день бьюсь над этой проблемой.
Я исп. хранимые процедуры. Но толку от них мало,
потому что им ведь надо передать переменную
@image размером больше 64K!!! ODBC этого
делать не хочет
Считаю единственным выходом сконфигурить этот
ODBC. Но как это сделать не знаю... пока.
Во всяком случае QueryAnalyzer это делать умеет
(там есть соотв. вкладка свойств подключения),
значит хотя бы теор. это сделать можно!
...
Рейтинг: 0 / 0
тип image
    #32024499
Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это опять я.
Только что у меня всё получилось.
Я сменил провайдера: вместо
MS OLE DB Provider for ODBC Driver
исп. MS OLE DB Provider for SQL Server.
Удачи!
...
Рейтинг: 0 / 0
тип image
    #32024625
kseniya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
А это опять я.
А где его менять? Вообще как лучше подключаться к базе в данном случае?
...
Рейтинг: 0 / 0
тип image
    #32024655
Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, Ксения!
В данном случае я исп. Delphi, компоненты вкладки ADO.
Там есть компонент ADOConnection а у него свойство
ConnectionString. Этой строчки передаются все параметры
подключения к БД. Так вот вместо OLE DB for ODBC ставишь
OLE DB for SQL Server. И вроде всё более менее хорошо работает.
Если ты исп. не Delphi, то это не беда (а может и преимущество ).
Чего-то подобное есть и в басике и в с++ (всё это относится к ADO).

P.S. С наступающим!
...
Рейтинг: 0 / 0
тип image
    #32024669
kseniya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, Денис!
Странно, я и так использую ADO и OLE DB for SQL Server... И всё равно не катит Только у меня VB
А с ХП точно ничего не получается, можно и не пробовать?

P.S. Спасибо
...
Рейтинг: 0 / 0
тип image
    #32029006
2128506
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а никто не пробовал работать только с хранимыми процедурами, передавая в качестве параметра смещение и сколько прочитать (записать)?

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, поскольку заводить его ради одного (пускай большого)значения не правильно.
...
Рейтинг: 0 / 0
тип image
    #32029008
2128506
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот так оно на самом деле

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
...
Рейтинг: 0 / 0
тип image
    #32029011
Dankov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kseniya, можно попробовать перед открытием рекордсета в той же сессии послать на сервер "SET TEXTSIZE 2147483647". Это должно заставить провайдера увеличить свой буфер под блоб.
...
Рейтинг: 0 / 0
тип image
    #32029013
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Dankov (для сведения)

Цитатка из BOL:
The SQL Server ODBC driver and Microsoft OLE DB Provider for SQL Server automatically set TEXTSIZE to 2147483647 when connecting.
...
Рейтинг: 0 / 0
тип image
    #32029118
2128506
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я НАШЕЛ!
Надо обновить 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 байта на блок мне хватает с избытком.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / тип image
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]