Quando tento fazer uma função, que acessa o banco de dados, e no final dessa funcção ela chama uma outra função que també m acessa o banco de dados, dá erro dizendo que a conexão já está aberta, ou que já existe um data reader para essa conexao. Me ajudem por favor, segue o código:
'carrega as respostas com o resultado
Public Sub carrega_resultado(ByVal intCodPerg As Integer)
Dim strRespostas As String
Dim cmdRespostas As OleDbCommand
Dim intResultPerg As Integer
'recupera o total de vezes que a pergunta foi respondida
intResultPerg = resultado_pergunta(Convert.ToInt32(cbPerguntas.SelectedValue))
Try
'abre conexao
objConnP.Open()
'monta o SELECT para recuperar as respostas
strRespostas = "SELECT r.cod_resposta, " & _
"r.desc_resposta " & _
"FROM respostas AS r " & _
"WHERE r.cod_pergunta = " & intCodPerg
cmdRespostas = New OleDbCommand(strRespostas, objConnP)
'executa o comando e preenche o datareader das respostas
drRespostas = cmdRespostas.ExecuteReader
Catch erro As Exception
MsgBox("Erro (039): " & erro.Message, MsgBoxStyle.Critical)
End Try
'criando objetos para criar o resultado
Dim dtResultado As New DataTable("Resultado")
Dim dtcResultado As DataColumn
Dim dtrResultado As DataRow
'criando as colunas da tabela
'codigo resposta
dtcResultado = New DataColumn()
dtcResultado.DataType = Type.GetType("System.Int32")
dtcResultado.ColumnName = "Codigo"
dtcResultado.ReadOnly = True
dtcResultado.Unique = True
dtResultado.Columns.Add(dtcResultado)
'resposta
dtcResultado = New DataColumn()
dtcResultado.DataType = Type.GetType("System.String")
dtcResultado.ColumnName = "Resposta"
dtcResultado.ReadOnly = False
dtcResultado.Unique = False
dtResultado.Columns.Add(dtcResultado)
'resultado
dtcResultado = New DataColumn()
dtcResultado.DataType = Type.GetType("System.Int32")
dtcResultado.ColumnName = "Resultado"
dtcResultado.ReadOnly = False
dtcResultado.Unique = False
dtResultado.Columns.Add(dtcResultado)
Try
'enquanto tiverem respostas
While drRespostas.Read
dtrResultado = dtResultado.NewRow
dtrResultado("Codigo") = drRespostas.GetInt32(0)
dtrResultado("Resposta") = drRespostas.GetString(1)
dtrResultado("Resultado") = Convert.ToBoolean(resultado_resposta(drRespostas.GetInt32(0)) / intResultPerg)
dtResultado.Rows.Add(dtrResultado)
End While
'preenche o datagrid
dgResultado.DataSource = dtResultado
Catch erro As Exception
MsgBox("Erro (040): " & erro.Message, MsgBoxStyle.Critical)
Finally
'fecha conexao
objConnP.Close()
End Try
End Sub
'retorna o numero de vezes que uma resposta foi citada
Public Function resultado_resposta(ByVal intCodResp As Integer) As Integer
Dim strResultado As String
Dim cmdResultado As OleDbCommand
Dim drResultado As OleDbDataReader
Try
'abre conexao
objConnP.Open()
'monta SELECT para contar os resultados das respostas
strResultado = "SELECT COUNT(rp.cod_resposta_pergunta) AS totalResp " & _
"FROM resposta_pergunta AS rp " & _
"WHERE rp.cod_resposta = " & intCodResp
cmdResultado = New OleDbCommand(strResultado, objConnP)
'executa o comando e preenche o datareader
drresultado = cmdResultado.ExecuteReader
'se tiver dados
If drResultado.Read Then
'retorna a quantidade de vezes que uma resposta foi citada
Return drResultado.GetInt32(0)
End If
Catch erro As Exception
MsgBox("Erro (042): " & erro.Message, MsgBoxStyle.Critical)
Finally
'fecha conexao
objConnP.Close()
End Try
End Function










