Ver Mensaje Individual
  #6 (permalink)  
Antiguo 18/06/2010, 06:43
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Verificar registro en tabla con mysql desde visual basic.net

Cita:
Hola amigo tengo problemas con estas dos lineas: supongo que ?nombre es para el campo nombre en la base de datos y Nombre es el ato que recibe el textbox, te agradeceré una explicación, lo otro es que no se trabajar con clases, perdón mi ignorancia pero no tengo un profesor que me ayude con esto, me toca hacerlo de manera autónoma.
No. ?nombre es un parámetro dentro del string de al consulta donde el conector colocará el valor que está llegando como variable.
Como te dije y te aconsejé, no debes poner funciones de base de datos en el código de un form, no solamente porque es problemático para luego hacer correctos debuggeos, sino porque además estarás abriendo múltiples instancias de conexión que terminarán saturando el conection poool de Windows, o bien dejarás objetos "vivos" donde no debes.

Separa los Form de una clase global donde manejes todos los elementos de base de datos... La ortodoxia es mejor para evitar dolores de cabeza.

Volviendo al problema, me explico: Todos los Namespaces que manejan ADO (acceso a datos) usan algún objto command (OracleCommand, SqlComand, MysqlCommand, etc.), que para mejor uso es preferible parametrizar si vas a combinarlo con datos entrantes, y no crear con ellos un sólo string de consulta.
Yo bien podría haber puesto esto:
Código vb.net:
Ver original
  1. Public Function VerificarUsuario(ByVal oNombre As String) As Boolean
  2.     Dim oSql as String = "SELECT (COUNT(*)>0) existe FROM usuarios WHERE nombre = '" & oNombre & "';"
  3.     Dim oCom as New MysqlCommand(oSql, oCxn)
  4.     Return Convert.ToBoolean(oCom.ExecuteScalar())
  5. End Function
con lo que me evitaría usar parámetros. Pero si bien eso funciona, cuando trabajas con valores numéricos o fechas empiezas a tener problemas con la representación regional de la PC donde se usa la aplicación (nosotros usamos decimales con comas, pero las bases de datos los esperan con punto, por ejemplo). En ese caso es mejor dejar que el conector resuelva el problema y listo. Y para eso se usan parámetros.
Ahora bien, ¿dónde pone el dato en la sentencia el conector? Simple: se le indica dentro del string de modo que sepa que pedazo debe reemplazar.
El problema es que representar parámetros dentro de un string de una consulta en SQL varía según el DBMS que uses. Si usas SQL Server, deben ir precedidos de "@", pero si usas MySQL los parámetros se indican con "?".
¿Se entiende?
Entonces, lo que en la sentencia SQL aparece como "?nom", es un parámetro que el conector debe reemplazar con un valor no nulo. Luego se indica qué parámetro y en qué dirección viaja.
Esto sucede porque un parámetro puede ser de entrada, salida, o entrada/salida.

Así que, explicado sería:
Código vb.net:
Ver original
  1. ' Función pública que debe estar en una clase diseñada para manejar la base de datos.
  2. Public Function VerificarUsuario(ByVal oNombre As String) As Boolean
  3.     ' oNombre es una variable entrante que contiene l el nombre de usuario a consultar
  4.     ' Se crea una variable de tipo String para contener la consulta escrita en SQL,
  5.     ' donde se incluye un parámetro a ser reemplazado por el nombre
  6.     Dim oSql as String = "SELECT (COUNT(*)>0) existe FROM usuarios WHERE nombre = ?nom;"
  7.     ' Crear un objeto MysqlCommand con la sentencia y l ainstancia de conexión.
  8.     ' Requiere que exista una variable de la instancia de conexión, la cual debe estar abierta (Open) previamente.
  9.    ' Aconsejo usar un sólo objeto de conexión en la clase.
  10.     Dim oCom as New MysqlCommand(oSql, oCxn)
  11.     ' Se agrega un parámetro al objeto MysqlCommand, indicando el nombre del parámetro,
  12.     ' incorporando el valor por medio de la variable, e indicando la dirección (Input se refiere a que ingresa a la base)
  13.     oCom.Parameters.Add("?nom", oNombre).Direction = ParameterDirection.Input
  14.     ' Se usa el método ExecuteScalar() porque la consulta devolverá un valor único en cualquier caso.
  15.     ' Como el valor será un True o False, pero como tipo natural de MySQL, debe convertirse a Boolean para VB.Net.
  16.     ' toda la tarea se puede hacer en un sólo paso.
  17.     Return Convert.ToBoolean(oCom.ExecuteScalar())
  18. End Function

¿Se entiende un poco mejor?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)