ADO + Stored Procedure

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

ADO + Stored Procedure

Сообщение Scuder » 07.04.2004 (Ср) 16:58

Такая фигня - если процедура возвращает рекордсет, всё понятно.
Но если она возвращает значение внутренней переменной (return @DocID), как это значение выдернуть оттуда?

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 07.04.2004 (Ср) 18:05

В MSDN вагон примеров

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 08.04.2004 (Чт) 12:38

Да я его терпеть не могу! :-(

Ну, в общем нашёл то, что нужно, однако столкнулся с такой проблемой:
Входящий параметр в хранимой процедуре "@Param1 ntext".
Делаю следующее:
Код: Выделить всё
sParmName = "Param1"
Set ADOPrm = ADOCmd.CreateParameter(sParmName, adChar, adParamInput)
ADOCmd.Parameters.Append ADOPrm
ADOCmd.Parameters(sParmName).Value = "test"


Вылетает с ошибкой "Parameter object is improperly defined. Inconsistent or incomplete information was provided." на строке "
Код: Выделить всё
ADOCmd.Parameters.Append ADOPrm
"

И вроде бы понятно, что ругается на тип параметра, но я уже ВСЕ типы из списка перепробовал - ничего не получается.. :-(

P.S. все объявления правильные. другие процедуры с входящими параметрами int выполняются нормально. а как этой ntext скормить - that is the question..

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.04.2004 (Чт) 12:51

Попробуй adBSTR или adVar(W)Char
Lasciate ogni speranza, voi ch'entrate.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 08.04.2004 (Чт) 14:04

О! На adVarChar и adVarWChar так же ругается, а вот adBSTR я как-то и не заметил.. :-) Thx.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 08.04.2004 (Чт) 16:58

2 alibek

А если параметр такой: @Comment nvarchar(250) ??
Тут уже ничего не помогает.. :-( В т.ч. adVarChar..

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.04.2004 (Чт) 17:15

А кто СУБД? MS SQL?
Lasciate ogni speranza, voi ch'entrate.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 08.04.2004 (Чт) 17:18

Он самый..

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.04.2004 (Чт) 17:26

MSDN писал(а):nchar and nvarchar (T-SQL)
Character data types that are either fixed-length (nchar) or variable-length (nvarchar) Unicode data and use the UNICODE UCS-2 character set.

nchar(n)
Fixed-length Unicode character data of n characters. n must be a value from 1 through 4,000. Storage size is two times n bytes. The SQL-92 synonyms for nchar are national char and national character.
nvarchar(n)
Variable-length Unicode character data of n characters. n must be a value from 1 through 4,000. Storage size, in bytes, is two times the number of characters entered. The data entered can be 0 characters in length. The SQL-92 synonyms for nvarchar are national char varying and national character varying.
Remarks
When n is not specified in a data definition or variable declaration statement, the default length is 1. When n is not specified with the CAST function, the default length is 30.

Use nchar when the data entries in a column are expected to be consistently close to the same size.

Use nvarchar when the data entries in a column are expected to vary considerably in size.

SET ANSI_PADDING OFF does not apply to nchar or nvarchar. SET ANSI_PADDING is always ON for nchar and nvarchar.


Из сказанного могу заключить, что должен быть либо adBSTR либо adWChar.
Попробуй, а если не подойдет, завтра еще подумаю.
Lasciate ogni speranza, voi ch'entrate.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 08.04.2004 (Чт) 17:48

Хрень какая-то.. На adWChar он пишет то самое сообщение об ошибке..
А на adBSTR вместо слова "test" функция получает только "t"..

Код: Выделить всё
sParmName = "Comment"
Set ADOPrm = ADOCmd.CreateParameter(sParmName, adBSTR, adParamInput)
ADOCmd.Parameters.Append ADOPrm
ADOCmd.Parameters(sParmName).Value = "test"


И вообще прикол:

Код: Выделить всё
sParmName = "Comment"
Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, adParamInput)
ADOCmd.Parameters.Append ADOPrm
ADOCmd.Parameters(sParmName).Value = CStr(1234567890)


В этом случае функция реально получает строку "1234567890"! Обрати внимание на adInteger! И абсолютно не ругается!

Я, кажется, вообще перестаю что-либо понимать в связке VB-ADO-TSQL.. :-(

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 09.04.2004 (Пт) 10:06

Scuder писал(а):Хрень какая-то..

И вообще прикол:

Код: Выделить всё
sParmName = "Comment"
Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, adParamInput)
ADOCmd.Parameters.Append ADOPrm
ADOCmd.Parameters(sParmName).Value = CStr(1234567890)


В этом случае функция реально получает строку "1234567890"! Обрати внимание на adInteger! И абсолютно не ругается!

Я, кажется, вообще перестаю что-либо понимать в связке VB-ADO-TSQL.. :-(


наверное всетаки так

Код: Выделить всё
sParmName = "Comment"
Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, adParamInput)
ADOCmd.Parameters.Append ADOPrm
ADOPrm.Value = ......

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 09.04.2004 (Пт) 11:02

Те же яйца, вид сбоку..

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.04.2004 (Пт) 11:15

Фиг его знает. Почему вместо "test" возвращает "t" у меня есть одна идея - unicode-строка "test" возвращается еще раз в unicode, т.е. t*e*s*t*, поэтому у режет. А вот почему оно возвращает так, непонятно. А какой ConnectionString? Может локаль указана неправильно?
Lasciate ogni speranza, voi ch'entrate.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 09.04.2004 (Пт) 11:29

Код: Выделить всё
ATempDB.ConnectionString = "Provider=MSDATASHAPE; Data Provider=SQLOLEDB.1;Password=xxx;Persist Security Info=False;User ID=xxx;Initial Catalog=xxx;Data Source=xxx"
ATempDB.Open

ATempRS.CursorType = adOpenKeyset
ATempRS.LockType = adLockOptimistic
ATempRS.CursorLocation = adUseClient


Не знаю, я повторю: другие процедуры с входящими параметрами типа int, date работают нормально..

...unicode-строка "test" возвращается еще раз в unicode, т.е. t*e*s*t*, поэтому у режет. А вот почему оно возвращает так, непонятно.


Так может, ей в другом формате, отличном от unicode, передавать?

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 09.04.2004 (Пт) 12:22

Короче! Ну ладно я! Первый раз с этим столкнулся, но вы!! ;-)

Если @Comment nvarchar(250), то:

Код: Выделить всё
sParmName = "Comment"
Set ADOPrm = ADOCmd.CreateParameter(sParmName, adBSTR, adParamInput)
ADOCmd.Parameters.Append ADOPrm
ADOCmd.Parameters(sParmName).Size = 250
ADOCmd.Parameters(sParmName).Value = "test"


Но в любом случае спасибо 2 alibek за помощь и всем остальным за моральную поддержку. :-)


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList