Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 ADO + SQL2000  [new]
MVN
Member

Откуда: Пермь
Сообщений: 381
Работаю через ADODB(провайдер SQLOLEDB) к SQL2000 и опять ошибки:

1) Открыл коннекшн.
2) Открываю транзакцию: ConShort.BeginTrans.
3) Запустил процедуру на сервере, в ней создал глобальную временную таблицу.
4) Открыл рекордсет по этой таблице, все в порядке.

Теперь пробую выполнить UPDATE или DELETE, и возвращает такую ошибку:
With ADODB.Errors(0)
.Number = -2147467259
.Source = "Microsoft OLE DB Provider for SQL Server"
.NativeError = 0
.Description = "Не удается создать новое подключение в режиме ручного или распределенного выполнения транзакций."

Что это?
16 мар 04, 12:31    [579996]     Ответить | Цитировать Сообщить модератору
 Re: ADO + SQL2000  [new]
Senin Viktor
Member

Откуда: Подмосковье
Сообщений: 5006
Покажи код м.б. у тебя этот случай
 If you create a global temporary table named ##employees, any user in the 

database can work with this table. If no other user works with this table after you
create it, the table is deleted when you disconnect. If another user works with the
table after you create it, SQL Server deletes it when both of you disconnect.
16 мар 04, 13:09    [580162]     Ответить | Цитировать Сообщить модератору
 Re: ADO + SQL2000  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
#mytable - локальная временная таблица умирает вместе с конекшеном из которого ее создали и если ее создали в хранимке по завершению хранимки, видна только из этого конекшена

##mytable - глобальная временная таблица умирает вместе с конекшеном из которого ее создали, видна всем

bol
A local temporary table created in a stored procedure is dropped automatically when the stored procedure completes.

The table can be referenced by any nested stored procedures executed by the stored procedure that created the table.
The table cannot be referenced by the process which called the stored procedure that created the table.

All other local temporary tables are dropped automatically at the end of the current session.

Global temporary tables are automatically dropped when the session that created the table ends and all other tasks
have stopped referencing them. The association between a task and a table is maintained only for the life of a single
Transact-SQL statement. This means that a global temporary table is dropped at the completion of the last
Transact-SQL statement that was actively referencing the table when the creating session ended.


а вот слова "в режиме ручного или распределенного выполнения транзакций"
мне не совсем понятны в данном контексте. за распределенные транзакции отвечает служба msdts но причем здесь она? может не запущена?
16 мар 04, 13:27    [580236]     Ответить | Цитировать Сообщить модератору
 Re: ADO + SQL2000  [new]
Pavel
Member

Откуда: Кемерово
Сообщений: 2435
Это еще один неприятный глюк проектов ADP: чтобы иметь возможность добавления\удаления записей во временную таблицу необходимо наличие прав dbo на базу tempdb.
Есть еще одна мысль, но для начала хочется посмотреть полный код всех операций.
16 мар 04, 17:56    [581247]     Ответить | Цитировать Сообщить модератору
 Re: ADO + SQL2000  [new]
MVN
Member

Откуда: Пермь
Сообщений: 381
Senin Viktor : точно не этот

АлексейК : у меня точно не распределенная транзакция. Нужно читать из описания ошибки только выделенную часть: "Не удается создать новое подключение в режиме ручного или распределенного выполнения транзакций."

Код кнопки:
Private Sub Кнопка8_Click()
On Error GoTo Err_Кнопка8_Click

Dim P As ADODB.Recordset
'Функция открывает коннекшн ConShort
If MakeConnection = False Then GoTo Exit_Кнопка8_Click

ConShort.BeginTran
STR = "EXEC dbo.PredstavleniyaPoZayavkam "

'Функция закрывает глобальный рекордсет R если он был открыт и
'устанавливает adCursorLocation переданный в функцию как параметр
MakeR adUseServer

'Процедура dbo.PredstavleniyaPoZayavkam создает и заполняет временную
'глобальную таблицу ##TMPTBLFORREPORTPREDSTAVLENIYASMATERIALAMI
ConShort.Execute STR, , adExecuteNoRecords

R.Open "SELECT XRecID FROM ##TMPTBLFORREPORTPREDSTAVLENIYASMATERIALAMI WITH(NOLOCK) GROUP BY XRecID", ConShort, adOpenForwardOnly, adLockReadOnly, adCmdText

'Вот здесь и зависает до тайм-аута или с генерит ошибку описанную выше
ConLong.Execute "DELETE ##TMPTBLFORREPORTPREDSTAVLENIYASMATERIALAMI WHERE (XRecID = " & R("XRecID") & ")", , adExecuteNoRecords

Exit_Кнопка8_Click:
On Error Resume Next
DoCmd.Hourglass False
ConShort.CommitTran
ConShort.Execute "DROP TABLE ##TMPTBLFORREPORTPREDSTAVLENIYASMATERIALAMI", , adExecuteNoRecords
Access.Application.SysCmd acSysCmdClearStatus
P.Close
Set P = Nothing
R.Close
If Me.Visible = False Then Me.Visible = True
Exit Sub

Err_Кнопка8_Click:
If ConShort.Errors.Count Then
ErrorMsgBoxADO ConShort.Errors
ConShort.Errors.Clear
ConShort.RollbackTran
Else
Select Case Err.Number
Case 2501
Case Else: ErrorMsgBox Err.Number, Err.Description, , "Кнопка8_Click"
End Select
End If
Resume Exit_Кнопка88_Click
End Sub
17 мар 04, 07:11    [581757]     Ответить | Цитировать Сообщить модератору
 Re: ADO + SQL2000  [new]
MVN
Member

Откуда: Пермь
Сообщений: 381
Код естественно подрезал, но ничего вроде не упустил. Мне не понятно почему я находясь внутри одной транзакции не могу делать изменения?

Когда явно транзакцию не открываю, то проблемм не возникает. Т.е. по всей вероятности все дело должно быть в блокировках на SQL-Server. Но блокировать по-моему он должен для других транзакций, а логическая целостность при выполнении операций должна ложиться на разработчика, т.е. для транзакции, открывшей таблицу для чтения, по-моему, не должно быть препядствий при изменении данных, тем более что таблица открыта с хинтом NOLOCK.

Однако сервер пишет: "Не удается создать новое подключение в режиме ручного или распределенного выполнения транзакций.", т.е. скорее всего АДО пытается открыть новое подключение и в нём выполнить DELETE/UPDATE. Естественно для другой транзакции таблица для изменений будет блокированна, но он открыть новый коннекшн не может, следовательно...

а что дальше?
17 мар 04, 07:24    [581769]     Ответить | Цитировать Сообщить модератору
 Re: ADO + SQL2000  [new]
Senin Viktor
Member

Откуда: Подмосковье
Сообщений: 5006
запусти Профайлер - посмотри что на сервере творится до вызова ошибочной строки.
А еще лучше - отпиши в форум по MS SQL
17 мар 04, 09:16    [581853]     Ответить | Цитировать Сообщить модератору
 Re: ADO + SQL2000  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
в этой строке рекордсет заполняется ?
число записей сколько ожидалось?

R.Open "SELECT XRecID FROM ##TMPTBLFORREPORTPREDSTAVLENIYASMATERIALAMI WITH(NOLOCK) GROUP BY XRecID",

попробуй поставить r.movelast и посмотри число записей.
17 мар 04, 09:21    [581862]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить