|
|
|
ADO + SQL2000
|
|||
|---|---|---|---|
|
#18+
Работаю через 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.03.2004, 12:31 |
|
||
|
ADO + SQL2000
|
|||
|---|---|---|---|
|
#18+
Покажи код м.б. у тебя этот случай Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 13:09 |
|
||
|
ADO + SQL2000
|
|||
|---|---|---|---|
|
#18+
#mytable - локальная временная таблица умирает вместе с конекшеном из которого ее создали и если ее создали в хранимке по завершению хранимки, видна только из этого конекшена ##mytable - глобальная временная таблица умирает вместе с конекшеном из которого ее создали, видна всем bol Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. а вот слова "в режиме ручного или распределенного выполнения транзакций" мне не совсем понятны в данном контексте. за распределенные транзакции отвечает служба msdts но причем здесь она? может не запущена? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 13:27 |
|
||
|
ADO + SQL2000
|
|||
|---|---|---|---|
|
#18+
Это еще один неприятный глюк проектов ADP: чтобы иметь возможность добавления\удаления записей во временную таблицу необходимо наличие прав dbo на базу tempdb. Есть еще одна мысль, но для начала хочется посмотреть полный код всех операций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 17:56 |
|
||
|
ADO + SQL2000
|
|||
|---|---|---|---|
|
#18+
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.03.2004, 07:11 |
|
||
|
ADO + SQL2000
|
|||
|---|---|---|---|
|
#18+
Код естественно подрезал, но ничего вроде не упустил. Мне не понятно почему я находясь внутри одной транзакции не могу делать изменения? Когда явно транзакцию не открываю, то проблемм не возникает. Т.е. по всей вероятности все дело должно быть в блокировках на SQL-Server. Но блокировать по-моему он должен для других транзакций, а логическая целостность при выполнении операций должна ложиться на разработчика, т.е. для транзакции, открывшей таблицу для чтения, по-моему, не должно быть препядствий при изменении данных, тем более что таблица открыта с хинтом NOLOCK. Однако сервер пишет: "Не удается создать новое подключение в режиме ручного или распределенного выполнения транзакций.", т.е. скорее всего АДО пытается открыть новое подключение и в нём выполнить DELETE/UPDATE. Естественно для другой транзакции таблица для изменений будет блокированна, но он открыть новый коннекшн не может, следовательно... а что дальше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 07:24 |
|
||
|
ADO + SQL2000
|
|||
|---|---|---|---|
|
#18+
запусти Профайлер - посмотри что на сервере творится до вызова ошибочной строки. А еще лучше - отпиши в форум по MS SQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 09:16 |
|
||
|
ADO + SQL2000
|
|||
|---|---|---|---|
|
#18+
в этой строке рекордсет заполняется ? число записей сколько ожидалось? R.Open "SELECT XRecID FROM ##TMPTBLFORREPORTPREDSTAVLENIYASMATERIALAMI WITH(NOLOCK) GROUP BY XRecID", попробуй поставить r.movelast и посмотри число записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 09:21 |
|
||
|
|

start [/forum/topic.php?fid=45&fpage=1666&tid=1676043]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
327ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 668ms |

| 0 / 0 |
