MARS-MULTIPLE ACTIVE RECORDSETS COM SQLSERVER 08

HIDDEN 25/02/2011 12:33:14
#366580
A conexão com o aplicativo está normal. A conexão com o banco, adição e atualização de registros está normal. Mas quando vou processar um determinado código, tenho o erro: Conexão Ocupada com resultados de outro HSTMT. Pesquisando, descobri que algumas aplicações tentam trabalhar de forma assíncrona quando recuperam dados do banco de dados. O código que gera o erro abre uma conexão. Antes que ela seja finalizada e todos os dados recuperados, uso a conexão para outra atividade... e aí o erro, pois a conexão estará bloqueada já que os resultados da consulta ainda não todos enviados.

Posso fazer uma gambiarra de código, tipo abrir uma outra conexão para processar isso. Mas sei que posso utilizar MARS para contornar o problema. Mas ainda não achei nenhum artigo sobre como proceder.

Alguém sabe como utilizar MULTIPLE ACTIVE RECORDSETS com SQL Server 2008?


HIDDEN 25/02/2011 13:00:56
#366584
Talvez seja erro no código. Acontece que está funcionando com MySQL. A não ser que haja uma codificação específica para o caso do SQL Server.

O código:

         SQLSource = lcFc_DATA_SQL

tbPesq.Open SQLSource, Conn, adOpenForwardOnly, adLockOptimistic
With tbPesq
If Not .EOF Then
.MoveFirst
Do While Not .EOF
lcFc_DATA_Lista_AddItem !Ok, !Tipo, !Codigo, !Data
SQLQuery = lcFc_DATA_SQLEx2(!Codigo)
tbPesqSub.Open SQLQuery, Conn, adOpenForwardOnly, adLockOptimistic
If Not tbPesqSub.EOF Then
tbPesqSub.MoveFirst
Do While Not tbPesqSub.EOF
lcFc_DATA_Lista_AddSUBItem Record, 0, tbPesqSub!Tipo, tbPesqSub!Codigo, tbPesqSub!Data
tbPesqSub.MoveNext
Loop
End If
tbPesqSub.Close
.MoveNext
Loop
Else
Screen.MousePointer = 0
Exit Function
End If
End With

tbPesq.Close
Set tbPesq = Nothing
HIDDEN 25/02/2011 13:49:50
#366596
Citação:

deixa eu ver se entendi.

vc gera uma uma tabela e com o resultado desta tabela vc gera ou outra tabela.

pq nao faz isso em uma unica select? mssql pode usar sub select.



Essa abordagem não funciona para o caso em específico. Eu carrego um Recordset1. Este Recordset1 da origem a um Recordset2. é preciso fazer desta forma devido a limitação do componente que uso para exibir os dados. Com os dados do primeiro Recordset crio uma linha no componente (Um produto, por exemplo). Com o segundo Recordset, carrego os dados associados ao primeiro Recordset (movimento de estoque do produto, por exemplo). Como um grid hierarquico.

Como são poucos dados, da para fazer desta forma sem perda de performance.
Tópico encerrado , respostas não são mais permitidas