|
Непонятное поведение ADODB в 1С 8.0
|
|||
---|---|---|---|
#18+
Непонятное поведение ADODB в 1С 8.0 Есть необходимость записи данных в произвольную базу на MS SQL 2005 Standard. Запись реализуется с помощью хранимых процедур. Пример хранимой процедуры: CREATE PROCEDURE TestProc @ID Int OUTPUT, @F1 NChar(10) AS BEGIN INSERT INTO TestTable (F1) VALUES (@F1) SET @ID = SCOPE_IDENTITY() END GO То есть, эта процедура добавляет запись в таблицу, пишет переданное значение в поле F1 и позвращает значение Identity параметром @ID. Процедура рабочая. Работает и в QueryAnalyser, и в Delphi (TADOCommand). Identity возвращается нормально. Теперь код в 1С 8.0 Процедура ТестСКЛ() Перем пСтрСоед; Перем пСоед; Перем пКом; Перем пРС; Перем пИД; пСтрСоед = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DocExchange1C;Data Source=SRV01"; пСоед = Новый COMОбъект("ADODB.Connection"); пСоед.Provider = "SQLOLEDB"; пСоед.ConnectionTimeout = 15; пСоед.CommandTimeOut= 30; пСоед.ConnectionString = пСтрСоед; пСоед.Open(); пКом = Новый COMОбъект("ADODB.Command"); пКом.ActiveConnection = пСоед; пКом.CommandType = 4; пКом.CommandText = "TestProc"; пКом.Parameters("@F1").Value = "qqq"; пРС = пКом.Execute(); пИД = пКом.Parameters("@ID").Value; Предупреждение(пИД); пСоед.Close(); КонецПроцедуры Код отрабатывает без ошибок, запись в базу добавляется, но выходной параметр процедуры @ID равен Null (видно по отладчику). Опыты показали, что выходной параметр все- таки возвращается в 1С, если в тексте нет конструкций INSERT, UPDATE или DELETE, или если он присваивается до них. То есть, если CREATE PROCEDURE TestProc @ID Int OUTPUT, @F1 NChar(10) AS BEGIN SET @ID = 111 END GO Или CREATE PROCEDURE TestProc @ID Int OUTPUT, @F1 NChar(10) AS BEGIN SET @ID = 111 INSERT INTO TestTable (F1) VALUES (@F1) END GO Тогда выходной параметр @ID будет возвращен в 1С со значением 111. Создается такое впечатление, что ADODB.Connection, будучи использован в 1С, игнорирует выходные параметры процедуры, если их присвоение производится после INSERT (UPDATE,DELETE) Кстати, если в процедуре после INSERT (UPDATE, DELETE) производится SELECT, то рекордсет в таких случаях всегда возвращается в 1С пустой. Вопрос: Как побороть такую глюку? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2007, 07:18 |
|
Непонятное поведение ADODB в 1С 8.0
|
|||
---|---|---|---|
#18+
_roadsterВопрос: Как побороть такую глюку? Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2007, 13:05 |
|
Непонятное поведение ADODB в 1С 8.0
|
|||
---|---|---|---|
#18+
Уже догадался :0) CREATE PROCEDURE TestProc @ID Int OUTPUT, @F1 NChar(10) AS BEGIN INSERT INTO TestTable (F1) VALUES (@F1) SET NOCOUNT ON SET @ID = SCOPE_IDENTITY() END GO Так параметры нормально возвращаются. Важно ставить этот SET до возврата параметра, но после инсерта, иначе, как показывает эксперимент, RecordsAffected неверный будет Или так CREATE PROCEDURE TestProc @ID Int OUTPUT, @RecordsAffected Int OUTPUT, @F1 NChar(10) AS BEGIN SET NOCOUNT ON INSERT INTO TestTable (F1) VALUES (@F1) SET @ID = SCOPE_IDENTITY() SET @RecordsAffected = @@ROWCOUNT END GO ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2007, 12:47 |
|
Непонятное поведение ADODB в 1С 8.0
|
|||
---|---|---|---|
#18+
Еще вопрос. Дельфийный TADOCommand, без указания SEN NOCOUNT ON, тем не менее, нормально интерпретирует выходные параметры. Как бы ADODB.Command в 1С также подкрутить? Смотрел исходники TADOCommand, ничего такого не нашел... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2007, 12:53 |
|
Непонятное поведение ADODB в 1С 8.0
|
|||
---|---|---|---|
#18+
_roadsterЕще вопрос. Дельфийный TADOCommand, без указания SEN NOCOUNT ON, тем не менее, нормально интерпретирует выходные параметры. Как бы ADODB.Command в 1С также подкрутить? Смотрел исходники TADOCommand, ничего такого не нашел... Использовать Код: plaintext
В твоем случае будет так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2007, 13:49 |
|
Непонятное поведение ADODB в 1С 8.0
|
|||
---|---|---|---|
#18+
RTFM: "When ADO is returning "output" or "return" parameter values to the user from a datasource, ADO will only read the values once from the provider. This means that if the user reads the values before they are ready, they may not be retrieved. Accessing the parameter value before the recordset has been closed on a forward-only, read-only cursor on Microsoft SQL Server will result in the parameter value being retrieved before it's available. Referring to the parameter only after the recordset was closed (instead of before and after) will retrieve the correct parameter value." Так что использование NextRecordset здесь просто удачное совпадение (из-за уничтожения ссылки на текущий рекордсет). Достаточно вообще не получать ссылку на рекордсет: Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2007, 17:20 |
|
|
start [/forum/topic.php?fid=28&tid=1525191]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 163ms |
0 / 0 |