elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  problemas y dudas con ADO
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problemas y dudas con ADO  (Leído 2,569 veces)
Majinz

Desconectado Desconectado

Mensajes: 15


Ver Perfil
problemas y dudas con ADO
« en: 7 Mayo 2011, 06:48 am »

Hola que tal como estan, nuevamente los molesto con una duda, estoy haciendo una aplicacion que mediante una db responde preguntas, el problema radica en que cuando quiero probar la aplicacion me tira este error "procedimiento externo no valido" en la segunda linea podria alguien decirme que hice mal, no se si esto influya en algo pero la db tiene una tabla llamada dialogo y dos columnas, la primera es pregunta y la segunda es respuesta
Código
  1. Dim adoConexion As New ADODB.Connection
  2. adoConexion.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Persist Security Info=True; Data Source = (App.Path & \Dialogo.MDB)"
  3. adoConexion.Open
  4.  
  5. Dim sSQLQuery As String
  6. sSQLQuery = "SELECT *" & vbCr
  7. sSQLQuery = sSQLQuery & "FROM Dialogo" & vbCr
  8. sSQLQuery = sSQLQuery & "WHERE Nombre = '" & Text2.Text & "'" & vbCr
  9.  
  10. Dim adoRegistros As New ADODB.Recordset
  11. adoRegistros.Open sConsulta, adoConexion, adOpenStatic, adLockReadOnly
  12.  
  13. Private Sub Command1_Click()
  14. If adoRegistros.BOF = adoRegistros.EOF And adoRegistros.EOF = False Then
  15. Label1.Text = adoConsulta!Respuesta
  16. End If
  17. End Sub
  18.  


« Última modificación: 7 Mayo 2011, 17:45 pm por raul338 » En línea

seba123neo
Moderador
***
Desconectado Desconectado

Mensajes: 3.621



Ver Perfil WWW
Re: problemas y dudas con ADO
« Respuesta #1 en: 7 Mayo 2011, 07:17 am »

Hola, te felicito por usar ADO y desde codigo, y no usar controles como el ADODC o DATA.

primero que nada decirte que no declares las variables como As New, y siempre lo hagas con As primero, y despues setearla con Set, ¿porque? bueno porque la primera forma esta desaconsejada usar por temas de performance, ya que el visual basic internamente chequea (cada vez que usas la variable), chequea si el objeto esta instanciado o no, en cambio de la segunda forma no lo hace y es la correcta, aparte una vez me paso de mantener un sistema que lanzaba un error y era porque estaba declarada una variable con As New, desde el IDE funcionaba correctamente, pero al compilarlo lanzaba error y era por eso.esto es para cualquier objeto.

siempre que se usa algo de bases de datos es bueno usar un modulo comun para declarar las variables globales y ahi en el Sub_Main del modulo hacer la conexion a al base, y dejar los formularios sin ese codigo.

para eso debes agregar un modulo y en las propiedades de tu proyecto, debes cambiar para que el proyecto comienze desde el Sub_Main y no desde el Formulario, eso lo cambias en una opcion llamada Objeto de Inicio.

estas 2 variables adoConexion y adoRegistros deben ir en un modulo comun.

y debes en el Sub_Main setearlas y conectarte a la base.

aca te paso un codigo de como deberia quedar el modulo.

Código
  1. Option Explicit
  2.  
  3. Public mConexion As ADODB.Connection 'Conexion Principal
  4. Public mRs As ADODB.Recordset  'Recordset Principal
  5. Public mRsAux As ADODB.Recordset  'Recordset Auxiliar
  6. Public mCmd As ADODB.Command 'Para Ejecutar Comandos
  7.  
  8. Sub Main()
  9.  
  10.    Set mConexion = New ADODB.Connection
  11.    Set mRs = New ADODB.Recordset
  12.    Set mRsAux = New ADODB.Recordset
  13.    Set mCmd = New ADODB.Command
  14.  
  15.    mConexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\TuBase.mdb;"
  16.    mConexion.Open
  17.  
  18.    frmLogin.Show ' Aca mostras tu Formulario de inicio
  19.  
  20. End Sub

otra cosa, esa variable que puse llamada mCmd es para ejecutar comandos SQL, o sea INSERTS, DELETE, UPDATE a la base de datos, ya que yo opto por usarlo asi en vez de usar los metodos .AddNew o .Update o Delete del recordset, lo cual te va a enseñar de paso el lenguaje SQL.

ahi fijate el codigo App.Path & "\TuBase.mdb;", ahi cambiale el nombre por el de tu base y ese App.Path hace que la base de datos daba estar en la misma carpeta del proyecto donde va a estar el .exe compilado despues, ya que no debes usar rutas fijas como por ejemplo "C:\base\base.mdb" ya que eso solo funcionaria en tu pc, siempre la base debe estar en el directorio de la aplicacion o en una subcarpeta en este, o en una carpeta de red compartida. eso lo tenes mal ahi vos en el codigo por eso no te funciona.

no hace falta que pongas los vbCr en la cadena SQL.

saludos.


« Última modificación: 7 Mayo 2011, 07:19 am por seba123neo » En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: problemas y dudas con ADO
« Respuesta #2 en: 7 Mayo 2011, 17:46 pm »

Código
  1. If adoRegistros.BOF = adoRegistros.EOF And adoRegistros.EOF = False Then
  2. Label1.Text = adoConsulta!Respuesta
  3. End If
  4.  

No se si sea error tuyo (Text en lugar de caption) o es que me suena a .net
En línea

Majinz

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: problemas y dudas con ADO
« Respuesta #3 en: 7 Mayo 2011, 20:12 pm »

muchas gracias seba123neo has sido muy amable y explicito, tenias razon, voy a poner en practica tus consejos, tengo otra duda tu variable mCmd hace innecesario las query verdad?
tienes razon raul338, es que en un principio eran dos txtbox, pero el que obtenia la respuesta era innecesario, y lo cambie por un label, a la vista queda mas lindo :)
En línea

Majinz

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: problemas y dudas con ADO
« Respuesta #4 en: 7 Mayo 2011, 21:04 pm »

seba123neo use tu modulo y arregle mi form quedo asi

Código
  1. Private Sub Command1_Click()
  2. If mRs.BOF = mRs.EOF And mRs.EOF = False Then
  3. Label1.Caption = adoConsulta!Respuesta
  4. End If
  5. End Sub
  6.  
  7. Private Sub Form_Unload(Cancel As Integer)
  8. mConexion.Close
  9. Set mConexion = Nothing
  10. End
  11. End Sub

pero me tira este error "la operacion no esta permitida si el objeto esta cerrado"

intente esto

Código
  1. Private Sub Command1_Click()
  2. mConexion.Open
  3. If mRs.BOF = mRs.EOF And mRs.EOF = False Then
  4. Label1.Caption = adoConsulta!Respuesta
  5. End If
  6. End Sub
  7.  
  8. Private Sub Form_Unload(Cancel As Integer)
  9. mConexion.Close
  10. Set mConexion = Nothing
  11. End
  12. End Sub

Ahora el error es inverso, es decir "la operacion no esta permitida si el objeto esta abiero", si no es molestia podrias decirme a que se debe?
« Última modificación: 7 Mayo 2011, 21:52 pm por seba123neo » En línea

seba123neo
Moderador
***
Desconectado Desconectado

Mensajes: 3.621



Ver Perfil WWW
Re: problemas y dudas con ADO
« Respuesta #5 en: 7 Mayo 2011, 22:11 pm »

Majinz, cuando publiques codigo trata de ponerlo entre el geshi de visual basic, por las dudas es [ code=vb] tu codigo aca... [ /code] asi queda mejor, y trata de indentar el codigo fuente.

el modulo que yo te puse lo unico que hace es crear e instanciar las variables publicas para usarlas en el proyecto cuando quieras, y conectarte a la base de datos, eso es lo que hace el modulo.

la variable mCmd es para ejecutar comandos, o sea cuando necesites insertar registros , actualizar registros o borrar registros vas a usar esta variable.

por ahora lo que vos necesitas es hacer una consulta(SELECT) a la base, pero para eso debes usar la variable mRs y para que funcione debes pasarle la consulta SQL que necesitas hacer. eso no lo veo en tu codigo por eso te tira error, en ningun momento veo que abras el recordset para hacer la consulta. tampoco necesitas hacer ese mConexion.Open, ya que la conexion a la base ya esta abierta desde el modulo, y queda abierta y activa todo el programa, hasta que se cierra.

aca te paso un ejemplo de como lo haria yo, una simple consulta a la base de datos, supongamos que estas usando el modulo que te pase, esto deberia funcionar.

Código
  1. Option Explicit
  2.  
  3. Private Sub Command1_Click()
  4.    Call CargarDatos
  5. End Sub
  6.  
  7. Private Sub CargarDatos()
  8.    Dim vSQL As String
  9.  
  10.    vSQL = "SELECT campo FROM tabla" ' String para la consulta SQL
  11.    mRs.Open vSQL, mConexion, adOpenKeyset, adLockOptimistic, adCmdText ' abris el recodset publico con la consulta
  12.  
  13.    If mRs.EOF Then ' Si tiene datos
  14.        Label1.Caption = mRs("campo") ' obtenemos el valor del campo de la consulta
  15.    End If
  16.  
  17.    mRs.Close 'cerramos el recordset para que quede disponible para usar de nuevo cuando queramos.
  18. End Sub
  19.  
  20. Private Sub Form_Unload(Cancel As Integer)
  21.    mConexion.Close
  22.    Set mConexion = Nothing
  23.    End
  24. End Sub

fijate que simple que es, simplemente en el boton llamamos a un Sub que nos hace la consulta. ahi esta explicado en el codigo lo que hace cada linea.

si por alguna razon alguna vez necesitas de usar 2 recorset al mismo tiempo, fijate que en el modulo hay otro auxiliar para llamarlo cuando quieras, y si por las dudas necesitas un tercero o mas...los declaras en el formulario como local, lo usas y los cerras ahi mismo.

saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
dudas de problemas con winsock
Programación Visual Basic
fraktal 2 1,050 Último mensaje 19 Septiembre 2006, 11:22 am
por fraktal
Varias dudas/problemas
Materiales y equipos
gil13 8 4,316 Último mensaje 7 Septiembre 2009, 21:46 pm
por gil13
PROBLEMAS DUDAS con usb con ALFA 1MW
Materiales y equipos
kokakolo 1 2,285 Último mensaje 13 Marzo 2010, 20:28 pm
por ChimoC
Dudas y posibles problemas en Windows 7.
Dudas Generales
Tachikomaia 2 3,486 Último mensaje 20 Noviembre 2020, 12:30 pm
por Tachikomaia
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines