Visual Basic.NET - PROBLEMA EN CONSULTA A TABLA DE ACCESS DESDE V.B

 
Vista:

PROBLEMA EN CONSULTA A TABLA DE ACCESS DESDE V.B

Publicado por IVAN (14 intervenciones) el 08/11/2015 01:51:13
Buenas noches.

Os explico. Tengo una base de datos Access, con los campos "ID", "Usuario", "Contraseña", "PaisDocumento", "NumDocumento" y "Email".
El campo "ID" és autonumérico y el campo "PaisDocumento" es numerico. El resto de campo son de texto. El campo "PaisDocumento" es numérico porque tiene una relación (uno a muchos) con otra tabla, que es de países. Esta base de datos la tengo conectada con una aplicación de Visual Basic.

Y ahora viene el problema... Estoy intentando hacer una consulta, desde VB, a esa base de datos, para que me compare los campos "Email", "PaisDocumento" y "NumDocumento" (dos campos "string" y el otro "integer") con la información de una variable, un textbox y un combobox. La idea es que si coincide el contenido de esa variable, ese textbox y ese combobox, con los 3 campos de la base de datos, entonces que me ejecute el código que le pida. Este es el código que he utilizado:

Private Sub ButtonValidar_Click(sender As Object, e As EventArgs) Handles ButtonValidar.Click
Dim conexion As New OleDbConnection
Dim comando As New OleDbCommand
Dim adaptador As New OleDbDataAdapter
Dim lector As OleDbDataReader
Dim consulta As String
Try
conexion.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = C:\Users\ivanm\Documents\Visual Studio 2015\Projects\Cash\Cash\Bases de datos\basedatos.accdb"
conexion.Open()
consulta = "SELECT Email, PaisDocumento, NumDocumento FROM usuarios WHERE Email='" & usuarios.email & "' AND PaisDocumento='" & ComboBoxPais.SelectedValue & "' AND NumDocumento='" & TextBoxDocumento.Text & "'"
comando = New OleDbCommand(consulta, conexion)
adaptador.SelectCommand = comando
lector = comando.ExecuteReader
If lector.HasRows = True Then
ComboBoxPais.Enabled = False
TextBoxDocumento.Enabled = False
ButtonValidar.Enabled = False
ButtonEditar.Visible = True
ButtonObtener.Enabled = True
ButtonObtener.Focus()
Else
MsgBox("El documento introducido no existe o no se corresponde con la dirección de e-mail introducida.", MsgBoxStyle.Critical, "¡Aviso!")
TextBoxDocumento.Clear()
TextBoxDocumento.Focus()
End If
Catch ex As Exception
MsgBox("Error al conectar con la base de datos de usuarios.", MsgBoxStyle.Critical, "¡Aviso!")
End Try
conexion.Close()
End Sub

El problema lo tengo en la línea marcada en negrita (lector=comando.ExecuteReader). Me dice que no coinciden los tipos de datos en la expresión de criterios. He estado haciendo pruebas y he comprobado que el problema lo tengo por tener dos campos "string" y uno "integer". Supongo que de alguna manera tengo que convertir ese campo "integer" en "string", pero no sé cómo.

Me gustaría que me dijérais qué tengo que modificar del código para que me funcione.

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Wilfredo Patricio Castillo
Val: 1.239
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

PROBLEMA EN CONSULTA A TABLA DE ACCESS DESDE V.B

Publicado por Wilfredo Patricio Castillo (720 intervenciones) el 09/11/2015 21:57:41
Eso es simple, no tienes que convertir el campo integer a string, mas bien lo que tienes que hacer es convertir, ese datos a integer.

Debería quedarte así:

1
consulta = "SELECT Email, PaisDocumento, NumDocumento FROM usuarios WHERE Email='" & usuarios.email & "' AND PaisDocumento='" & Convert.ToInt32( ComboBoxPais.SelectedValue) & "' AND NumDocumento='" & TextBoxDocumento.Text & "'"

Ahora, mi recomendación es que jamás hagas ese tipo de concatenaciones, ya que lo haces muy vulnerable a SQLInjection.

Ya que defines un objeto Command, puedes usarlo así:

1
2
3
4
5
6
7
comando.CommandText="SELECT Email, PaisDocumento, NumDocumento FROM usuarios WHERE Email=@email  AND PaisDocumento=@Pais AND NumDocumento=@Documento"
 
comando.CommandType=CommandType.Text
comando.Connection=conexion
comando.Parameters.Add("@email",SqldbType.Varchar).Value=usuarios.email
comando.Parameters.Add("@Pais",SqlDbType.Int).Value=Convert.ToInt32(ComboboxPais.SelectedValue)
comando.Paramerers.Add("@Documento",SqlDbType.Varchar).Value=Texboxdocumento.text

Y ya lo demas sabes como hacerlo.

También podrías usar String.Format, pero evita en lo posible esas concatenaciones.

Espero haberte dado una luz.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar