Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / тип image / 17 сообщений из 17, страница 1 из 1
05.03.2002, 06:10
    #32024345
kseniya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
Привет!
Помогите кто может!
Есть таблица в которой хранятся бинарные данные в поле типа 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
05.03.2002, 08:01
    #32024364
qu-qu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
>> почему???????

Наверное, потому что - 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
05.03.2002, 11:48
    #32024402
kseniya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
первый вариант не пробовала, но по поводу остальных - то же самое..
в рекордсет-то данные добавляются нормально, в любом количестве, а ошибка происходит на этапе rs.Update
...
Рейтинг: 0 / 0
05.03.2002, 12:52
    #32024413
Tabloid
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
Лично я в таких ситуациях пользуюсь хранимыми процедурами. И никаких проблем нет.
...
Рейтинг: 0 / 0
05.03.2002, 13:35
    #32024426
kseniya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
а есть хоть какой-нить примерчик? была бы очень благодарна
а то времени мало
...
Рейтинг: 0 / 0
05.03.2002, 14:03
    #32024429
Tabloid
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
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
05.03.2002, 14:04
    #32024430
Tabloid
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
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
06.03.2002, 07:52
    #32024494
Denis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
Привет!
Тоже уже 4-й день бьюсь над этой проблемой.
Я исп. хранимые процедуры. Но толку от них мало,
потому что им ведь надо передать переменную
@image размером больше 64K!!! ODBC этого
делать не хочет
Считаю единственным выходом сконфигурить этот
ODBC. Но как это сделать не знаю... пока.
Во всяком случае QueryAnalyzer это делать умеет
(там есть соотв. вкладка свойств подключения),
значит хотя бы теор. это сделать можно!
...
Рейтинг: 0 / 0
06.03.2002, 08:22
    #32024499
Denis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
Это опять я.
Только что у меня всё получилось.
Я сменил провайдера: вместо
MS OLE DB Provider for ODBC Driver
исп. MS OLE DB Provider for SQL Server.
Удачи!
...
Рейтинг: 0 / 0
07.03.2002, 05:13
    #32024625
kseniya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
Привет!
А это опять я.
А где его менять? Вообще как лучше подключаться к базе в данном случае?
...
Рейтинг: 0 / 0
07.03.2002, 08:23
    #32024655
Denis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
Привет, Ксения!
В данном случае я исп. Delphi, компоненты вкладки ADO.
Там есть компонент ADOConnection а у него свойство
ConnectionString. Этой строчки передаются все параметры
подключения к БД. Так вот вместо OLE DB for ODBC ставишь
OLE DB for SQL Server. И вроде всё более менее хорошо работает.
Если ты исп. не Delphi, то это не беда (а может и преимущество ).
Чего-то подобное есть и в басике и в с++ (всё это относится к ADO).

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

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

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
27.04.2002, 03:34
    #32029008
2128506
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
вот так оно на самом деле

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
27.04.2002, 05:22
    #32029011
Dankov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
kseniya, можно попробовать перед открытием рекордсета в той же сессии послать на сервер "SET TEXTSIZE 2147483647". Это должно заставить провайдера увеличить свой буфер под блоб.
...
Рейтинг: 0 / 0
27.04.2002, 06:17
    #32029013
qu-qu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
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
29.04.2002, 02:09
    #32029118
2128506
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип image
Я НАШЕЛ!
Надо обновить 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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / тип image / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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