none
Excepción no controlada del tipo 'System.Data.OracleClient.OracleException' en System.Data.OracleClient.dll (ayudenme por favor) RRS feed

  • Pregunta

    • Alguien me podria ayudar  a solucionar ese "error" estoy tratando de hacer un login en visual basic conectado a oracle 11g(sql developer) la conexion esta bien pero quisiera saber porque me sale ese mensaje y no se direcciona al otro  Windos Forms(frmInicio)

    esto es el codigo :

    Imports System.Data.OracleClient

    Public Class Form1
        Dim conexion As New OracleConnection
        Dim comandos As New OracleCommand
        Dim adaptador As New OracleDataAdapter
        Dim lector As OracleDataReader

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Try
                conexion = New OracleConnection("DATA SOURCE=localhost:1521/xe;PASSWORD=ADMIN;USER ID=ADMIN")
                conexion.Open()
                MessageBox.Show("conexion")
            Catch ex As Exception
                MessageBox.Show("error al intentar conectar :" + ex.ToString)
            End Try
        End Sub

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

            Dim consulta As String

            consulta = "SELECT * FROM USUARIOS WHERE USU_NOMBRE='" & txtUser.Text & "' and USU_CONTRASEÑA='" & txtPass.Text & "'"
            comandos = New OracleCommand(consulta, conexion)
            adaptador.SelectCommand = comandos
            lector = comandos.ExecuteReader

            If lector.Read = True Then
                frmInicio.Show()
            Else
                MessageBox.Show("Usuario o contraseña incorrecta")
            End If


        End Sub
    End Class

    esta es la tabla que cree

    la tabla que cree para los usuarios 

    miércoles, 12 de julio de 2017 5:29

Respuestas

  • Hola:
    Si quieres que al iniciar tu aplicacion te presente un Form para hacer login y si cumple los requisitos, te presente un Form Inicial, puedes hace algo como esto

    Option Strict On
    Option Explicit On
    Module Inicio
        Public msCadenaSQL As String
        Private _prevInstanceMutex As System.Threading.Mutex
        Public Sub Main()
            ' Compruebo si existe una instancia
            If lF_PreviaInstancia() = True Then
                MessageBox.Show("La aplicacion ya se esta ejecutando", "Sub Main", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return
            End If
            'Ejecutamos nuestra aplicación
            Application.EnableVisualStyles()
            Dim Resultado As DialogResult
            Using lofrm As New FrmLogin
                lofrm.ShowDialog()
                Resultado = lofrm.DialogResult
                If Resultado = DialogResult.OK Then
                    Dim loPrincipal As New FrmInicial
                    Application.Run(loPrincipal)
                End If
            End Using
        End Sub

        Private Function lF_PreviaInstancia() As Boolean
            Dim lbNuevo As Boolean
            ' Obtengo el nombre completo del ensamblado para usarlo como nombre del mutex
            Dim lsNombre As String = Reflection.Assembly.GetEntryAssembly.FullName
            ' Creo el mutex intentando ser su propietario. Si el mutex ya fue creado por otra instancia, no se va a poder tomar propiedad del 'mutex y nuevo sera = false
            _prevInstanceMutex = New System.Threading.Mutex(True, lsNombre, lbNuevo)
            Return Not lbNuevo
        End Function
    End Module

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Public Class FrmLogin
        Private Sub FrmLogin_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Me.ContextMenuStrip = cmenu  'cmenu es un menú contextual con 2 Menuiten (Aceptar y Salir)
            Me.FormBorderStyle = Windows.Forms.FormBorderStyle.Fixed3D
            Me.ControlBox = False
            Me.StartPosition = FormStartPosition.CenterScreen
        End Sub
        Private Sub SalirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalirToolStripMenuItem.Click
            Me.DialogResult = Windows.Forms.DialogResult.Cancel
            Me.Close()
        End Sub
        Private Sub AceptarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AceptarToolStripMenuItem.Click
            If lF_bLogin() = True Then
                Me.DialogResult = Windows.Forms.DialogResult.OK
                Me.Close()
            Else
                MessageBox.Show("Usuario/Password incorrecto(s)", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        End Sub

        Private Function lF_bLogin() As Boolean
            Try
                'Configurar la cadena de conexion del Administrador del fichero XML
                msCadenaSQL = "Server=TU_SERVIDOR;DataBase=TU_BASE_DATOSUid=TU_USUARIO;pwd=TU_CONTRASEÑA;"
                Using loConexion As New SqlConnection(msCadenaSQL)
                    loConexion.Open()
                    'Validar el usuario
                    Dim lsQuery As String = "Select Count(*) From USUARIOS Where USU_NOMBRE=@Nombre And USU_CONTRASEÑA=@Contraseña"
                    Dim lbRetorno As Boolean
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        loComando.Parameters.Add(New SqlParameter("@Nombre", Me.txtNombre.Text))
                        loComando.Parameters.Add(New SqlParameter("@Nombre", Me.txtNombre.Text))
                        lbRetorno = IIF(loComando.ExecuteScalar(),0,False,True)
                    End Using
                End Using
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "lF_bLogin", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return False
            End Try
            Return lbRetorno
        End Function
    End Class

    P.D.

    Este ejemplo es para SQL Server, para Oracle tendras que cambiar SqlConnection por OracleConnection y asi para los demás objetos de SQL Server

    Un saludo desde Bilbo
    Carlos


    miércoles, 12 de julio de 2017 10:28
  • "Alejandro Boza" preguntó:

    > ... la conexion esta bien pero quisiera saber porque me sale ese mensaje
    > y no se direcciona al otro  Windos Forms(frmInicio)
    >
    > esto es el codigo :

    Hola, Alejandro:

    Con Oracle no te voy a poder ayudar, pero sí te puedo indicar lo que tienes que hacer para capturar la excepción que estás obteniendo cuando invocas al método ExecuteReader del objeto llamado "lector".

    Tal y como claramente aparece en la imagen que has adjuntado, el mensaje de error de la excepción te está diciendo que existe un carácter inválido:

    ¿Dónde? Pues no sé dónde está el carácter inválido. Lo único que te puedo decir es que revises la sintaxis de la consulta SQL de selección que estás queriendo ejecutar, así como los valores existentes en los controles TextBox llamados txtUser y txtPass.

    Y para capturar la excepción, encierra el código de ejecución entre su correspondiente bloque Try ... Catch ... End Try:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' Nos indica si las credenciales del usuario son o no correctas Dim loginValido As Boolean Try ' Establecer una conexión con la base de datos de Oracle Using cnn As New OracleConnection(Escribe aquí la CADENA DE CONEXION con la base de Oracle) ' Crear el comando Dim cmd As OracleCommand = cnn.CreateCommand() ' Indicar la consulta que deseamos ejecutar con parámetros con nombre cmd.CommandText = "SELECT * FROM Usuarios WHERE USU_NOMBRE= :pUser AND USU_CONTRASEÑA= :pPass" ' Añadir los parámetros de entrada a la colección Parameters del comando cmd.Parameters.AddWithValue(":pUser" = txtUser.Text) cmd.Parameters.AddWithValue(":pPass" = txtPass.Text) ' Abrir la conexión cnn.Open() ' Abrir un lector como resultado de ejecutar la consulta ' Dim lector As OracleDataReader = cmd.ExecuteReader() lector = cmd.ExecuteReader() loginValido = lector.Read() ' Cerrar el lector lector.Close() End Using ' --> Aquí se cerrará la conexión con la base de Oracle If (loginValido) Then frmInicio.Show() Else MessageBox.Show("Usuario o contraseña incorrecta") End If Catch ex As Exception ' Se ha producido un error MessageBox.Show(ex.Message)
    Finally
    If (Not loginValido) Then
    ' Si las credenciales del usuario no son válidas,
    ' cerrar el formulario actual.
    Me.Close()
    End If
    End Try End Sub


    Como no tengo experiencia con Oracle, no estoy muy seguro que los parámetros con nombre se especifiquen como aparece en negrita:

        cmd.CommandText = "SELECT * FROM Usuarios WHERE USU_NOMBRE= :pUser AND USU_CONTRASEÑA= :pPass"

    Todo es cuestión de buscar información por Internet sobre cómo se especifican los parámetros con nombre en una consulta SQL y cómo se añaden a la colección Parameters de un objeto OracleCommand. Pero eso ya lo dejo en tus manos. ;-)

    ¡Eso es todo!

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    miércoles, 12 de julio de 2017 19:17
    Moderador

Todas las respuestas

  • ¿Qué valores tienes en txtUser.Text y en txtPass.Text?

    Estás abriendo la conexión en el Load para luego usarla en el botón y dejarla abierta. Lo lógico es que la abras al hacer el clic del botón y la cierres después de hacer la consulta.


    Saludos, Javier J

    miércoles, 12 de julio de 2017 6:27
  • Hola:
    Si quieres que al iniciar tu aplicacion te presente un Form para hacer login y si cumple los requisitos, te presente un Form Inicial, puedes hace algo como esto

    Option Strict On
    Option Explicit On
    Module Inicio
        Public msCadenaSQL As String
        Private _prevInstanceMutex As System.Threading.Mutex
        Public Sub Main()
            ' Compruebo si existe una instancia
            If lF_PreviaInstancia() = True Then
                MessageBox.Show("La aplicacion ya se esta ejecutando", "Sub Main", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return
            End If
            'Ejecutamos nuestra aplicación
            Application.EnableVisualStyles()
            Dim Resultado As DialogResult
            Using lofrm As New FrmLogin
                lofrm.ShowDialog()
                Resultado = lofrm.DialogResult
                If Resultado = DialogResult.OK Then
                    Dim loPrincipal As New FrmInicial
                    Application.Run(loPrincipal)
                End If
            End Using
        End Sub

        Private Function lF_PreviaInstancia() As Boolean
            Dim lbNuevo As Boolean
            ' Obtengo el nombre completo del ensamblado para usarlo como nombre del mutex
            Dim lsNombre As String = Reflection.Assembly.GetEntryAssembly.FullName
            ' Creo el mutex intentando ser su propietario. Si el mutex ya fue creado por otra instancia, no se va a poder tomar propiedad del 'mutex y nuevo sera = false
            _prevInstanceMutex = New System.Threading.Mutex(True, lsNombre, lbNuevo)
            Return Not lbNuevo
        End Function
    End Module

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Public Class FrmLogin
        Private Sub FrmLogin_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Me.ContextMenuStrip = cmenu  'cmenu es un menú contextual con 2 Menuiten (Aceptar y Salir)
            Me.FormBorderStyle = Windows.Forms.FormBorderStyle.Fixed3D
            Me.ControlBox = False
            Me.StartPosition = FormStartPosition.CenterScreen
        End Sub
        Private Sub SalirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalirToolStripMenuItem.Click
            Me.DialogResult = Windows.Forms.DialogResult.Cancel
            Me.Close()
        End Sub
        Private Sub AceptarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AceptarToolStripMenuItem.Click
            If lF_bLogin() = True Then
                Me.DialogResult = Windows.Forms.DialogResult.OK
                Me.Close()
            Else
                MessageBox.Show("Usuario/Password incorrecto(s)", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        End Sub

        Private Function lF_bLogin() As Boolean
            Try
                'Configurar la cadena de conexion del Administrador del fichero XML
                msCadenaSQL = "Server=TU_SERVIDOR;DataBase=TU_BASE_DATOSUid=TU_USUARIO;pwd=TU_CONTRASEÑA;"
                Using loConexion As New SqlConnection(msCadenaSQL)
                    loConexion.Open()
                    'Validar el usuario
                    Dim lsQuery As String = "Select Count(*) From USUARIOS Where USU_NOMBRE=@Nombre And USU_CONTRASEÑA=@Contraseña"
                    Dim lbRetorno As Boolean
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        loComando.Parameters.Add(New SqlParameter("@Nombre", Me.txtNombre.Text))
                        loComando.Parameters.Add(New SqlParameter("@Nombre", Me.txtNombre.Text))
                        lbRetorno = IIF(loComando.ExecuteScalar(),0,False,True)
                    End Using
                End Using
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "lF_bLogin", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return False
            End Try
            Return lbRetorno
        End Function
    End Class

    P.D.

    Este ejemplo es para SQL Server, para Oracle tendras que cambiar SqlConnection por OracleConnection y asi para los demás objetos de SQL Server

    Un saludo desde Bilbo
    Carlos


    miércoles, 12 de julio de 2017 10:28
  • "Alejandro Boza" preguntó:

    > ... la conexion esta bien pero quisiera saber porque me sale ese mensaje
    > y no se direcciona al otro  Windos Forms(frmInicio)
    >
    > esto es el codigo :

    Hola, Alejandro:

    Con Oracle no te voy a poder ayudar, pero sí te puedo indicar lo que tienes que hacer para capturar la excepción que estás obteniendo cuando invocas al método ExecuteReader del objeto llamado "lector".

    Tal y como claramente aparece en la imagen que has adjuntado, el mensaje de error de la excepción te está diciendo que existe un carácter inválido:

    ¿Dónde? Pues no sé dónde está el carácter inválido. Lo único que te puedo decir es que revises la sintaxis de la consulta SQL de selección que estás queriendo ejecutar, así como los valores existentes en los controles TextBox llamados txtUser y txtPass.

    Y para capturar la excepción, encierra el código de ejecución entre su correspondiente bloque Try ... Catch ... End Try:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' Nos indica si las credenciales del usuario son o no correctas Dim loginValido As Boolean Try ' Establecer una conexión con la base de datos de Oracle Using cnn As New OracleConnection(Escribe aquí la CADENA DE CONEXION con la base de Oracle) ' Crear el comando Dim cmd As OracleCommand = cnn.CreateCommand() ' Indicar la consulta que deseamos ejecutar con parámetros con nombre cmd.CommandText = "SELECT * FROM Usuarios WHERE USU_NOMBRE= :pUser AND USU_CONTRASEÑA= :pPass" ' Añadir los parámetros de entrada a la colección Parameters del comando cmd.Parameters.AddWithValue(":pUser" = txtUser.Text) cmd.Parameters.AddWithValue(":pPass" = txtPass.Text) ' Abrir la conexión cnn.Open() ' Abrir un lector como resultado de ejecutar la consulta ' Dim lector As OracleDataReader = cmd.ExecuteReader() lector = cmd.ExecuteReader() loginValido = lector.Read() ' Cerrar el lector lector.Close() End Using ' --> Aquí se cerrará la conexión con la base de Oracle If (loginValido) Then frmInicio.Show() Else MessageBox.Show("Usuario o contraseña incorrecta") End If Catch ex As Exception ' Se ha producido un error MessageBox.Show(ex.Message)
    Finally
    If (Not loginValido) Then
    ' Si las credenciales del usuario no son válidas,
    ' cerrar el formulario actual.
    Me.Close()
    End If
    End Try End Sub


    Como no tengo experiencia con Oracle, no estoy muy seguro que los parámetros con nombre se especifiquen como aparece en negrita:

        cmd.CommandText = "SELECT * FROM Usuarios WHERE USU_NOMBRE= :pUser AND USU_CONTRASEÑA= :pPass"

    Todo es cuestión de buscar información por Internet sobre cómo se especifican los parámetros con nombre en una consulta SQL y cómo se añaden a la colección Parameters de un objeto OracleCommand. Pero eso ya lo dejo en tus manos. ;-)

    ¡Eso es todo!

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    miércoles, 12 de julio de 2017 19:17
    Moderador