Erro: "Não TRANSACTION de BEGIN correspondentes" erro quando executa a TRANSACTION COMMIT É

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 810100
Sintomas
Quando você chamar uma recursiva do SQL Server o procedimento de um aplicativo ADO armazenado usando sintaxe ODBC CALL em uma TRANSACTION, você pode receber a seguinte mensagem de erro quando COMMIT TRANSACTION é executado:
A solicitação COMMIT TRANSACTION tem não correspondente BEGIN TRANSACTION. (Microsoft OLE DB Provider para SQL Server)
Causa
ADO faz o Microsoft SQL Server executar o procedimento armazenado em duas ocasiões. Primeiro, ele executa o procedimento com SET FMTONLY definido como ON. Quando SET FMT somente é definida como ON, SQL Server sempre excede o máximo de aninhamento nível (32) independentemente do parâmetro que é passado. Portanto, o SQL Server anula o lote e reverte a TRANSACTION. Como o SQL Server internamente executa esse método, nenhum erro é relatado. SQL Server executa o procedimento armazenado novamente. Desta vez, dependendo do parâmetro que é passado, a execução do procedimento armazenado ocorre.

Quando essa segunda execução do procedimento armazenado excede o limite de 32-nível, a mensagem de corrigir o erro é retornada. Quando a execução correta do procedimento armazenado não excede o máximo de nível de aninhamento, você receber a mensagem de erro descrita na seção "Sintomas". Isso ocorre quando COMMIT TRANSACTION é executado. Ele é executado porque o SQL Server revertida a TRANSACTION quando o aninhamento máximo foi excedido e SQL Server anulada o lote.
Resolução
Para contornar esse problema, não chame o procedimento armazenado usando sintaxe chamada ODBC. Você pode chamar o procedimento armazenado pode maneiras usando o ADO. Um dos métodos é chamar um procedimento armazenado usando um objeto de comando. A seguir está um exemplo:
  ' Command to execute the stored procedure   Dim cmd As ADODB.Command   Set cmd = New ADODB.Command   With cmd      ' Specify the command type as Stored Procedure      .CommandType = adCmdStoredProc      ' Specify the Stored Procedure to call      .CommandText = "RecursionTest"            ' Specify the Connection to be used      Set .ActiveConnection = cn            ' Set up new parameter for the stored procedure      Dim prm As Parameter      Set prm = cmd.CreateParameter("@Param", adInteger, adParamInput, , -35)      .Parameters.Append prm            ' Execute the Stored Procedure      .Execute   End With      Set cmd = Nothing
Situação
A Microsoft confirmou que esse é um problema nos produtos da Microsoft listados no começo deste artigo.
Mais Informações

Passos para reproduzir o problema

  1. Abra o SQL Query Analyzer.
  2. No banco de dados de exemplo Northwind, execute o SQL seguinte script para criar uma recursiva procedimento armazenado:
    CREATE PROCEDURE RecursionTest @Param Int As Set @Param = @Param + 1 If @Param < 3       Exec RecursionTest @Param 
  3. Crie um novo projeto Standard EXE no Visual Basic 6.0. Por padrão, é criado o Form1.
  4. No menu Project , clique em referências .
  5. Na lista referências , clique duas vezes em Microsoft ActiveX Data Objects 2.7 Library e, em seguida, clique em OK .
  6. Na caixa de ferramentas, clique duas vezes CommandButton para adicionar CommandButton ao formulário. Por padrão, Command1 é criado.
  7. Clique duas vezes em Button1 para adicionar código para o evento click de Command1 .
  8. Substitua o código existente no evento Command1_Click com o código a seguir:
    Private Sub Command1_Click()      ' Connect to SQL Server   Dim cn As ADODB.Connection   Set cn = New ADODB.Connection   cn.Open "Provider=SQLOLEDB; Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI"      ' Begin a Transaction   cn.Execute "BEGIN TRANSACTION", , adExecuteNoRecords      ' Create a Command to execute Stored Procedure   Dim cmd As ADODB.Command   Set cmd = New ADODB.Command   With cmd      strSQL = "{ call RecursionTest (?)}"      .CommandType = adCmdText      .CommandText = strSQL      Set .ActiveConnection = cn      .Prepared = True      .Parameters(0) = -3            ' Execute the Stored Procedure      .Execute   End With      Set cmd = Nothing      ' Commit the Transaction   cn.Execute "COMMIT TRANSACTION", , adExecuteNoRecords   cn.Close   Set cn = NothingEnd Sub
  9. No menu Executar , clique em Iniciar para executar o aplicativo.
  10. Clique em Command1 .
Referências
Para obter mais informações, visite o seguinte site da MSDN:

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 810100 - Última Revisão: 11/13/2006 08:04:12 - Revisão: 3.1

Microsoft ActiveX Data Objects 2.7, Microsoft Visual Basic Enterprise Edition for Windows 6.0, Microsoft Visual Basic 6.0 Learning Edition, Microsoft Visual Basic 6.0 Professional Edition

  • kbmt kbstoredproc kbsqlprog kbdatabase kbclient kberrmsg kbbug KB810100 KbMtpt
Comentários