Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 MS SQL и ADO - можно ли в одном коннекте/сессии скроллить курсор и выполнять UPDATE?  [new]
химер
Guest
Приветствую!

Я не имею опыта работы большого опыта работы через АДО, понадобилось в 1С обратиться напрямую к БД MS SQL.
Есть такая конструкция, сорри что в коде 1С, но суть кажется понятна:

Conn = Новый COMОбъект ("ADODB.Connection");
Conn.Open
(
Provider=SQLNCLI10.1;Password=***;Persist Security Info=True;User ID=***;Initial Catalog=db_test;Data Source=SQLSERVER01\DB;"
);
RS = Новый COMОбъект ("ADODB.RecordSet");
Conn.Execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE");
Conn.Execute("BEGIN TRAN");
RS = Conn.Execute("SELECT A,B,C FROM atable");
Пока НЕ (RS.EOF) Цикл
  //обработка
  Если (...) Тогда
    Conn.Execute("UPDATE atable SET failed=1 WHERE [anid] = " + RS.Fields(1).Value);
  КонецЕсли;
  RS.MoveNext();
КонецЦикла;
RS.Close();
(...)
Conn.Execute("COMMIT");


в этом случае UPDATE происходит в отдельном коннекте/сессии, и соответственно транзакции, а это не то, что требуется. Ну ипонятно что UPDATE в этом случае вообще не проходит из-за блокировки.

Конечно, обходные варианты есть, но стало интересно понять для себя - а такое вообще возможно? чтобы при открытом ADO-курсоре, который фетчится в цикле, в том же коннекте/сессии выполнить update? как в серверном T-SQL коде, при обходе курсора. Или у АДО-курсора другая механика, пока не не закроет выборку,не будет следующую инструкцию выполнять в том же коннекте/сессии? Потому что если вызывать UPDATE после RS.Close(),то исполняется в том же сеансе. Возможно, что-то с типами курсора АДО может помочь, или нет?
18 авг 15, 09:01    [18031967]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL и ADO - можно ли в одном коннекте/сессии скроллить курсор и выполнять UPDATE?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
химер
Conn.Execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE");

ну так вот ваше счастье по факту...за для нафига такой уровень изоляции при селекте ???
18 авг 15, 09:04    [18031976]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL и ADO - можно ли в одном коннекте/сессии скроллить курсор и выполнять UPDATE?  [new]
aleks2
Guest
А нафига там ваще цикл?

ЗЫ. Может, канешно, "Если (...) Тогда", но нам то не показывают.
18 авг 15, 09:12    [18032015]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL и ADO - можно ли в одном коннекте/сессии скроллить курсор и выполнять UPDATE?  [new]
химер
Guest
Maxx, к сожалению есть еще одно приложение, которое иногда модифицирует эту таблицу, из-за чего в моменте может быть нарушена целостность данных. приложение древнее, никаких локов и транзакций не использует, режет по-живому. новые строки дописывает, существующие правит и удаляет. когда его процедура завершена, то состояние в принципе целостное...приходится с ним совместно работать и вот так от него защищаться на время обмена данными.
18 авг 15, 09:17    [18032038]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL и ADO - можно ли в одном коннекте/сессии скроллить курсор и выполнять UPDATE?  [new]
химер
Guest
aleks2
А нафига там ваще цикл?

ЗЫ. Может, канешно, "Если (...) Тогда", но нам то не показывают.


там цикл документы формирует при соблюдении некоторых условий. а если условия не выполнены - нужно ставить признак того, что строки не обработаны. я сильно упростил логику, но суть в этом - некоторые строки надо метить как "кривые".
18 авг 15, 09:21    [18032051]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL и ADO - можно ли в одном коннекте/сессии скроллить курсор и выполнять UPDATE?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
химер
там цикл документы формирует при соблюдении некоторых условий. а если условия не выполнены - нужно ставить признак того, что строки не обработаны. я сильно упростил логику, но суть в этом - некоторые строки надо метить как "кривые".

вы не знаете конструкцию типа
update t set ...
from table t
  inner join/ cross apply  ....

химер
Maxx, к сожалению есть еще одно приложение, которое иногда модифицирует эту таблицу, из-за чего в моменте может быть нарушена целостность данных. приложение древнее, никаких локов и транзакций не использует, режет по-живому. новые строки дописывает, существующие правит и удаляет. когда его процедура завершена, то состояние в принципе целостное...приходится с ним совместно работать и вот так от него защищаться на время обмена данными.
В АДО есть обновляемый курсор и все такое (если памыть не изменяет)..вы думаете разработчики SQL Server не знают как работает их продукт ? Помоему вы откровенно перемудрили ..или не знаете всех механизмов с которыми пытаетть работать.
18 авг 15, 09:27    [18032076]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL и ADO - можно ли в одном коннекте/сессии скроллить курсор и выполнять UPDATE?  [new]
химер
Guest
Maxx
вы не знаете конструкцию типа


знаю,но не понимаю пока, как мне это может помочь. UPDATE я делаю на основании данных 1С вне этой таблицы. Я могу запросто собрать идентификаторы "кривых" записей во временный массив и затем пометить их после закрытия рекордсета, и получу решение. Но мог бы и в один проход это решать,если это все же можно при открытом рекордсете делать. рекордсет в реале сложнее - это запрос, а не простой селект из одной таблицы.

Maxx
вы думаете разработчики SQL Server не знают как работает их продукт ?

да нет, у меня к ним вообще нет никаких вопросов.


Maxx
Помоему вы откровенно перемудрили ..или не знаете всех механизмов с которыми пытаетть работать.

я этого не скрываю, я так и написал - я не имею опыта работы большого опыта работы через АДО.
18 авг 15, 09:36    [18032120]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL и ADO - можно ли в одном коннекте/сессии скроллить курсор и выполнять UPDATE?  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
химер
Или у АДО-курсора другая механика, пока не не закроет выборку,не будет следующую инструкцию выполнять в том же коннекте/сессии? Потому что если вызывать UPDATE после RS.Close(),то исполняется в том же сеансе. Возможно, что-то с типами курсора АДО может помочь, или нет?
Именно. Вам нужен клиентский статический курсор.

Либо меняйте данные в рекордсете и сохраняйте их в БД через UpdateBatch.
Пример - https://msdn.microsoft.com/en-us/library/windows/desktop/ms675835(v=vs.85).aspx
18 авг 15, 10:54    [18032606]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL и ADO - можно ли в одном коннекте/сессии скроллить курсор и выполнять UPDATE?  [new]
химер
Guest
автор
Именно. Вам нужен клиентский статический курсор.


Да, похоже на то. Спасибо, буду пробовать!
18 авг 15, 12:20    [18033129]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить