powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ADO + SQL2000
8 сообщений из 8, страница 1 из 1
ADO + SQL2000
    #32443268
MVN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работаю через 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 = "Не удается создать новое подключение в режиме ручного или распределенного выполнения транзакций."

Что это?
...
Рейтинг: 0 / 0
ADO + SQL2000
    #32443398
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажи код м.б. у тебя этот случай
Код: plaintext
1.
2.
3.
 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.
...
Рейтинг: 0 / 0
ADO + SQL2000
    #32443459
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
#mytable - локальная временная таблица умирает вместе с конекшеном из которого ее создали и если ее создали в хранимке по завершению хранимки, видна только из этого конекшена

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

bol
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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 но причем здесь она? может не запущена?
...
Рейтинг: 0 / 0
ADO + SQL2000
    #32444251
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это еще один неприятный глюк проектов ADP: чтобы иметь возможность добавления\удаления записей во временную таблицу необходимо наличие прав dbo на базу tempdb.
Есть еще одна мысль, но для начала хочется посмотреть полный код всех операций.
...
Рейтинг: 0 / 0
ADO + SQL2000
    #32444620
MVN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
ADO + SQL2000
    #32444630
MVN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код естественно подрезал, но ничего вроде не упустил. Мне не понятно почему я находясь внутри одной транзакции не могу делать изменения?

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

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

а что дальше?
...
Рейтинг: 0 / 0
ADO + SQL2000
    #32444705
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запусти Профайлер - посмотри что на сервере творится до вызова ошибочной строки.
А еще лучше - отпиши в форум по MS SQL
...
Рейтинг: 0 / 0
ADO + SQL2000
    #32444712
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в этой строке рекордсет заполняется ?
число записей сколько ожидалось?

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

попробуй поставить r.movelast и посмотри число записей.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ADO + SQL2000
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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