CONSULTA EM BANCO DE DADOS

ALMIR2014 21/01/2015 09:12:16
#443901
Bom dia pessoal
Alguem poderia me ajudar no código abaixo:
Estou tentando fazer uma pesquisa no banco de Dados, onde tenho duas tabelas, sendo uma Cadastro de Usuários e outra Cadastro de Tipos de Usuários.
TBUsuarios e TBTipo
a consulta está sendo feita da seguinte forma:
Dim Sql As String = [Ô]Select A.Nome, A.Login, A.Cargo, B.IDTipo From TBUsuarios A INNER JOIN TBTipo B ON A.Tipo = B.IDTipo Where A.ID[Ô] & codigo
Porem retorna o erro dizendo que nenhum valor foi fornecido para um ou mais parametros necessários.
os campos da tabela Usuarios são: ID - Nome - Login - Senha - Cargo - Tipo(Este somente registro o ID da tabela Tipo)
os campos da Tabela Tipo são: IDTipo - Tipo
Obrigado desde já.
ACCIOLLY 21/01/2015 09:50:29
#443902
Resposta escolhida
Voce tem que colocar o campo ID da tabela TBUsuarios dentro do select depois no lugar de [Ô]A[Ô] e [Ô]B[Ô] os nomes exatos das suas tabelas e por fim, se estiver pesquisando por um inteiro (número) colocar o sinal de igual tipo assim:

Dim Sql As String = [Ô]SELECT TBUsuarios.ID, TBUsuarios.Nome, TBUsuarios.Login, TBUsuarios.Cargo, TBTipo.Tipo FROM TBTipo INNER JOIN TBUsuarios ON TBTipo.IDTipo=TBUsuarios.Tipo WHERE TBUsuarios.ID = [Ô] & codigo
NICKOSOFT 22/01/2015 07:07:02
#443932
  Dim Sql As String = [Ô]Select A.Nome, A.Login, A.Cargo, B.IDTipo From  TBUsuarios A INNER JOIN TBTipo B ON A.Tipo = B.IDTipo Where A.ID[Ô] & codigo 

tente com um igual no final
  Where A.ID = [Ô] & codigo  
ALMIR2014 23/01/2015 19:41:01
#443979

Pessoal Tentei de todas as formas possíveis e não está dando certo
Quando informo um código inválido ele retorna false,
mas quando digito um código existente ele retorna true mas dá a seuinte mensagem:
[Ô]Tentativa inválida de chamar Read quando o leitor estava fechado.[Ô]
Segue o código.

Private Sub txtCodigo_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtCodigo.Validating
If txtCodigo.Text.Trim.Length > 0 Then
If PesquisarUsuario(txtCodigo.Text) Then
If Dr.Read Then
txtNome.Text = Dr.Item([Ô]nome[Ô]).ToString
txtLogin.Text = Dr.Item([Ô]Login[Ô]).ToString
txtCargo.Text = Dr.Item([Ô]Cargo[Ô]).ToString
cboTipo.SelectedValue = Dr.Item([Ô]IDTipo[Ô])
End If
End If
End If
End Sub

Private Function PesquisarUsuario(ByVal Codigo As Integer) As Boolean
Using Con As OleDbConnection = GetConection()
Try
Con.Open()
Dim Sql As String = [Ô]SELECT TBUsuarios.ID, TBUsuarios.Nome, TBUsuarios.Login, TBUsuarios.Cargo, TBTipos.IDTipo FROM TBUsuarios INNER JOIN TBTipos ON TBUsuarios.Tipo = TBTipos.IDTipo WHERE TBUsuarios.ID = [Ô] & Codigo
Cmd = New OleDbCommand(Sql, Con)
Dr = cmd.ExecuteReader
If Not Dr.HasRows Then
MsgBox([Ô]Usuário não cadastrado.[Ô], MsgBoxStyle.Information, [Ô]Erro![Ô])
Return False
End If

Catch ex As Exception
MsgBox([Ô]Não foi possível conectar ao Banco de Dados, erro:[Ô] & vbCrLf & ex.ToString, MsgBoxStyle.Information, [Ô]Erro[Ô])
Return False
End Try
Return True
End Using
End Function
FELLIPEASSIS 23/01/2015 20:59:33
#443980
já testou a query no banco de dados?
tenta assim no evento do textbox:
Dim dtr As SqlClient.SqlDataReader
Dim sql as String
Dim cmd As New SqlClient.SqlCommand
sql= [Ô]SELECT os campos FROM tabelas e os joins WHERE id = @id[Ô] [ô]@id será o parametro[ô]
cmd.Parameters.AddWithValue([Ô]@id[Ô], seutextbox.Text.ToString)

cmd.CommandText = sql
cmd.Connection = sua coneçao
dtr = cmd.ExecuteReader
dtr.Read()
txtNome.Text = dtr([Ô]Nome[Ô]).ToString
txtLogin.Text = dtr([Ô]login[Ô]).ToString
txtCargo.Text = dtr([Ô]cargo[Ô]).ToString
dtr.Close()
lembrando que no campo entre aspas [Ô][Ô] coloca-se o mesmo nome da tabela
e no select você pode usar apelidos ao invés de colocar o nome completo da tabela.
e o reader usa-se o codigo para melhor funcionamento, ou algo que seja único

ACCIOLLY 24/01/2015 00:19:10
#443983
bem não sou muito chegado no vb gosto mais do C#. pelo que entendi você quer fazer a pesquisa quando é inserido um valor no txtCodigo não é? já tentou fazer isso com o evento change? Esse erro que dá geralmente é porque a conexao está fechada. Se você nao se incomodar vou te dar uma dica pro seu projeto:

1º Crie uma classe e de a ela o nome de [Ô]conexao.vb[Ô] aqui vai a codificação dela:

Imports System.Data.OleDb

Public Class conexao

Public caminho As String = [Ô]Coloque os parametros de conexao ao banco aqui[Ô]
Public SQL As String
Public Con As OleDbConnection
Public data As New DataTable


Public Sub pesquisar()

Try
data.Rows.Clear()
Con = New OleDbConnection(caminho)
Con.Open()
Dim cmd As New OleDbCommand(Sql, Con)
Dim adapter As New OleDbDataAdapter(cmd)
adapter.Fill(data)
Con.Close()

Catch ex As Exception
MsgBox([Ô]Não foi possível conectar ao Banco de Dados, erro:[Ô] & vbCrLf & ex.ToString, MsgBoxStyle.Information, [Ô]Erro[Ô])
End Try

End Sub

End Class


2º depois você invoca o metodo da classe de conexao no método que vai colocar os valores nos textboxes

Private Sub txtCodigo_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtCodigo.Validating
Dim pesquisa As New conexao
pesquisa.SQL = [Ô]SELECT TBUsuarios.ID, TBUsuarios.Nome, TBUsuarios.Login, TBUsuarios.Cargo, TBTipos.IDTipo FROM TBUsuarios INNER JOIN TBTipos ON TBUsuarios.Tipo = TBTipos.IDTipo WHERE TBUsuarios.ID = [Ô] & codigo
pesquisa.pesquisar()
txtNome.DataBindings.Add([Ô]Text[Ô], pesquisa.data, [Ô]Nome[Ô])
txtLogin.DataBindings.Add([Ô]Text[Ô], pesquisa.data, [Ô]Login[Ô])
txtCargo.DataBindings.Add([Ô]Text[Ô], pesquisa.data, [Ô]Cargo[Ô])
cboTipo.ValueMember = [Ô]IDTipo[Ô]
cboTipo.DisplayMember = [Ô]Tipo[Ô]
cboTipo.DataSource = pesquisa.data
End Sub


Talvez isso não possa resolver completamente o seu problema, mas o que eu quero te mostrar é que uma pesquisa utilizando um data adapter é mais confiável e mais prático. isso porque você pode fazer qualquer pesquisa utilizando essa classe, é só passar o código sql pra variável SQL da classe conexao que nesse exemplo é invocada como pesquisa. tente adaptar esse código no seu projeto e poste pra gente o que conseguiu blz!
ALMIR2014 24/01/2015 20:25:25
#443997
Meus Caros colegas, agradeço a colaboração, porem, me baseando no código enviado pelo ACCIOLLY, consegui chegar a este código que funcionou perfeitamente.
Private Sub LocalizarDados()
Using Con As OleDbConnection = GetConection()
Try
Con.Open()
Sql = [Ô]SELECT TBUsuarios.ID, TBUsuarios.Nome, TBUsuarios.Login, TBUsuarios.Cargo, TBTipos.IDTipo FROM TBUsuarios INNER JOIN TBTipos ON TBUsuarios.Tipo = TBTipos.IDTipo WHERE TBUsuarios.ID = [Ô] & CInt(txtCodigo.Text)
Cmd = New OleDbCommand(Sql, Con)
Dr = Cmd.ExecuteReader
If Not Dr.HasRows Then
MsgBox([Ô]Usuário não cadastrado.[Ô], MsgBoxStyle.Information, [Ô]Erro![Ô])
Else
While Dr.Read()
txtNome.Text = Dr([Ô]Nome[Ô])
txtLogin.Text = Dr([Ô]Login[Ô])
txtCargo.Text = Dr([Ô]Cargo[Ô])
cboTipo.SelectedValue = Dr([Ô]IDTipo[Ô])
End While
End If
Catch ex As Exception
MsgBox([Ô]Não foram encontrados registros com este parâmetro.[Ô])
Finally
Con.Dispose()
Dr.Dispose()
End Try
End Using
End Sub

ACCIOLLY eu já uso uma classe onde declaro minha conexão que busco através do Using e sempre declaro minhas variáveis no início do Form. Pra ficar registrado como exemplo:
Imports System.Data.OleDb
---------------------------------------
Public Class frmCadFunc
Private Dt As DataTable
Private Da As OleDbDataAdapter
Private Cmd As OleDbCommand
Private Ds As New DataSet()
Private Dr As OleDbDataReader
Private Mensagem As Object
Private Sql As String

Obrigado a todos e fico feliz em saber que posso contar sempre com vocês. Afinal sou um aprendiz e aprendo a cada dia com vocês.
Tópico encerrado , respostas não são mais permitidas