UM INSERT DENTRO DE UM SELECT

HORICH 22/11/2013 14:43:47
#431377
Boa Tarde amigos, estou com uma duvida:


Eu tenho uma rotina assim:


  Dim DR As SqlClient.SqlDataReader
Dim SQL as String
SQL = [Ô]select * from tabela_de_telas[Ô]
Dim Comand as New SqlClient.SqlComand(SQL, SQLCON, Transaction)
DR = Comand.ExecuteReader
If DR.HasRows then
While DR.Read
SQL = [Ô]Insert into tb_usuario values (1,[Ô] & DR.Item([Ô]tela[Ô]) & [Ô])[Ô]
Dim Insert as New SqlClient.SqlComand(SQL, SQLCON, Transaction)
Insert.ExecuteNonQuery()
End While
End If



Isto esta dentro de um Try e dentro de uma transação para não inserir metade só dos dados caso de erro
porem esse insert no meio do meu selec ele não faz, fala que tem um Data Reader aberto,que tenho que fechar, porem se eu fechar o data reader ele não vai ler as próximas linhas...


Se alguém souber como posso fazer algo para realizar esta tarefa agradeço
OCELOT 22/11/2013 15:51:17
#431383
Resposta escolhida
Cada conexão só pode efetuar uma operação de cada vez, se você tem um DataReader aberto ele mantém a conexão em uso e não permite que mais nada seja feito nela.

Você dai tem duas opções, ou você carrega todos os dados na memória primeiro, fechando dai o datareader e depois trata os dados e efetua os inserts, ou você abre uma segunda conexão, ficando uma só pro datareader e outra para efetuar os inserts.

Um terceira alternativa talvez seria ativar o Multiple Active Result Sets (MARS) na string de conexão se for SQL Server 2005 ou superior se não me engano, mas nunca cheguei a usar ele e sempre tem muita discussão na internet sobre o que é melhor, usar o MARS ou duas conexões, e no geral não me parece ter muita vantagem entre um ou outro, ficando mais pelo gosto de cada um.
LUIZCOMINO 22/11/2013 16:57:34
#431393
segue amigo, não sei se tem algum erro mas já ajuda , a lógica é essa



Dim sMtz() As String
Dim i As Integer = 0
Dim DR As SqlClient.SqlDataReader
Dim SQL As String
SQL = [Ô]select * from tabela_de_telas[Ô]
Dim Comand As New SqlClient.SqlComand(SQL, SQLCON, Transaction)
DR = Comand.ExecuteReader
If DR.HasRows Then
While DR.Read
ReDim Preserve sMtz(i)
sMtz(i) = DR.Item([Ô]tela[Ô])
i = i + 1
End While
End If
DR.Close()


For i = 0 To UBound(sMtz)
SQL = [Ô]Insert into tb_usuario values (1,[Ô] & sMtz(i) & [Ô])[Ô]
Dim Insert As New SqlClient.SqlComand(SQL, SQLCON, Transaction)
Insert.ExecuteNonQuery()
Next
HORICH 25/11/2013 11:48:44
#431428
Obrigado amigos, vou testar aqui no projeto e assim que conseguir compartilho aqui com vocês e caso surgir outra duvida eu volto a postar aqui...
Grato
Horich
HORICH 25/11/2013 12:32:25
#431430
Como disse solucão:


  Dim DR As SqlClient.SqlDataReader
Dim SQL as String
SQL = [Ô]select * from tabela_de_telas[Ô]
Dim Comand as New SqlClient.SqlComand(SQL, SQLCON, Transaction)
DR = Comand.ExecuteReader
If DR.HasRows then
While DR.Read
SQL = [Ô]Insert into tb_usuario values (1,[Ô] & DR.Item([Ô]tela[Ô]) & [Ô])[Ô]
Dim Insert as New SqlClient.SqlComand(SQL, SQLCON2, Transaction2)
Insert.ExecuteNonQuery()
End While
End If
Transaction2.Commit()
SQLCON2.Close
Tópico encerrado , respostas não são mais permitidas