none
Parametros en consulta Access RRS feed

  • Pregunta

  • Hola

    Estoy realizando una aplicación con Vb.net usando una base de datos Access. Resulta que tengo hecha una consulta en el entorno de Access que funciona muy bien. Pero como tiene parametros no encuentro la forma de invocarla desde VB.net. Estuve buscando en varias partes, en este foro inclusive, y lo más concreto que obtuve fue "no se puede". ¿Es así?. Que me sugieren.

    Gracias


    Pedro

    domingo, 23 de julio de 2017 13:39

Respuestas

  • Hola Pedro:

    La sentencia más o menos te tendría que quedar así:

    Dim cadenaConexion As String = Configuracion.CadenaConexion
        Using Cnn As New OleDbConnection(cadenaConexion)
        Dim cmd As OleDbCommand = Cnn.CreateCommand()
                cmd.CommandType = CommandType.Text
                Cnn.Open()
    
                cmd.CommandText = "SELECT Principal.Fecha FROM Principal " &
                "WHERE (((Principal.Fecha)>= @parametro1 And (Principal.Fecha)<= @parametro2)) " &
                "ORDER BY Principal.Fecha DESC"
    
        With cmd.Parameters
        .AddWithValue(String.Format("@parametro1", "Valor parámetro 1"))
        .AddWithValue(String.Format("@parametro2", "Valor parámetro 2"))
        End With
    
        Using rst As OleDbDataReader = cmd.ExecuteReader()
        While rst.Read
                 TuFormula += rst.GetString(0)
        End While
        End Using
     End Using

    Ahí lo importante es que veas como se declaran los parámetros, su orden y como le asignas un valor a los mismos.

    Un saludo.

    Gemma

    domingo, 23 de julio de 2017 15:53

Todas las respuestas

  • Hola Pedro:

    Pon la consulta tal como la tienes hecha, así podremos ayudarte mejor.

    Un saludo.

    Gemma

    domingo, 23 de julio de 2017 13:47
  • Hola:

     Para pametrizar la consulta desde una aplicación .NET, sea C# o Vb.Net, tienes que usar el signo de interrogación "?" de cierre, antes del nombre o la posición, te cuento que en Access los parámetros se toman por posición y no por el nombre, el nombre te servirá para poder indentificarlos únicamente, entonces una consulta access parametrizada desde .Net podría ser:

    "INSERT INTO NombreTabla SET (NombreCampo1, NombreCampo2, NombreCampo3) VALUES (?nombreParametro1, ?nombreParametro2, ?nombreParametro3)"
    
    
    ' O bien por posicion:
    "INSERT INTO NombreTabla SET (NombreCampo1, NombreCampo2, NombreCampo3) VALUES (?, ?, ?)"
     Otro tema sera el seteo de información a estos parámetros, los commands, etc.


    Saludos desde Monterrey, Nuevo León, México!!!

    domingo, 23 de julio de 2017 14:23
  • La consulta es así

    SELECT Principal.Fecha
    FROM Principal
    WHERE (((Principal.Fecha)>=[@parametro] And (Principal.Fecha)<=[@parametro2]))
    ORDER BY Principal.Fecha DESC;

    ya probé con ?, lo intentaré de nuevo

    Gracias


    Pedro

    domingo, 23 de julio de 2017 15:31
  • Hola Pedro:

     Que intentaste?, desde donde? estas usando codigo Vb.NET? podrias mostrarnos lo que intentaste?


    Saludos desde Monterrey, Nuevo León, México!!!

    domingo, 23 de julio de 2017 15:32
  • Hola Pedro:

    La sentencia más o menos te tendría que quedar así:

    Dim cadenaConexion As String = Configuracion.CadenaConexion
        Using Cnn As New OleDbConnection(cadenaConexion)
        Dim cmd As OleDbCommand = Cnn.CreateCommand()
                cmd.CommandType = CommandType.Text
                Cnn.Open()
    
                cmd.CommandText = "SELECT Principal.Fecha FROM Principal " &
                "WHERE (((Principal.Fecha)>= @parametro1 And (Principal.Fecha)<= @parametro2)) " &
                "ORDER BY Principal.Fecha DESC"
    
        With cmd.Parameters
        .AddWithValue(String.Format("@parametro1", "Valor parámetro 1"))
        .AddWithValue(String.Format("@parametro2", "Valor parámetro 2"))
        End With
    
        Using rst As OleDbDataReader = cmd.ExecuteReader()
        While rst.Read
                 TuFormula += rst.GetString(0)
        End While
        End Using
     End Using

    Ahí lo importante es que veas como se declaran los parámetros, su orden y como le asignas un valor a los mismos.

    Un saludo.

    Gemma

    domingo, 23 de julio de 2017 15:53
  • mi codigo

    Private Sub EdicionPrincipal(a As Integer)
            REM a 1 nuevo  =2 modificar  = 3 borrar = 4 conculta
            Try
                ' Creamos y configuramos el comando que vamos a ejecutar
                Using cmd As New OleDbCommand()
                    ' Consulta SQL q vamos a ejecutar
                    If a = 1 Then
                        cmd.CommandText = "INSERT INTO `Principal` (`Fecha`, `Concepto`, `Debe`, `Haber`, `Correccion`, `Codigo`) VALUES (?, ?, ?, ?, ?, ?)"
                    ElseIf a = 2 Then
                        cmd.CommandText = "UPDATE Principal SET Fecha = ?, Concepto = ?, Debe = ?, Haber = ?, Correccion = ?, Codigo = ? WHERE (Id = ?)"
                    ElseIf a = 3 Then
                        cmd.CommandText = "DELETE FROM Principal WHERE (Id = ?)"
                    ElseIf a = 4 Then
                        cmd.CommandText = "SELECT Principal.* From Principal Where (((Principal.Fecha) >=[?] And (Principal.Fecha)<=[?]))Order By Principal.Fecha DESC;"
                    End If
                    ' Añadimos los parámetros de entrada y en el mismo
                    ' orden en el que se especificaron en la consulta SQL.
                    If a = 4 Then 'lo qe sigue es de prueba
                        Dim FECH As Date = "1/5/2017"
                        cmd.Parameters.AddWithValue("", FECH)
                        Dim fech1 As Date = "10/5/2017"
                        cmd.Parameters.AddWithValue("", fech1)
                    End If
                    ' Ejecutamos la consulta
                    ExecuteAction(cmd)
                End Using
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
            End Try
        End Sub

      Friend Function ExecuteAction(cmd As OleDbCommand) As Integer
            If (cmd Is Nothing) Then
                Throw New ArgumentNullException("cmd")
            End If
            Using cnn As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\DH.mdb")
                cmd.Connection = cnn
                cnn.Open()
                Return cmd.ExecuteNonQuery()
            End Using
        End Function

    se llama en este caso con a= 4

    Pero no funciona, aunque no da error.

    insert, update y delete funcionan bien.

    Gracias


    Pedro

    domingo, 23 de julio de 2017 22:05
  • Gemma

    de tu codigo no entiendo esta linea

           TuFormula += rst.GetString(0)

    ¿que es TuFormula ?

    gracias


    Pedro

    domingo, 23 de julio de 2017 22:25
  • Hola:

    Pero no funciona, aunque no da error.

    insert, update y delete funcionan bien.

    ¿Entonces que es lo que "no funciona"?, re cuerdo que entre mas detalles proporciones mas rapido llegamos a la solución de tu problema.

     Para lo que estas haciendo, te recomiendo encapsular cada acción vs la Bd en una función o método según corresponda, es decir, un método para el INSERT, DELETE, CREATE O UPDATE, de esa forma mantienes un código legible, fácil de mantener y mas ordenado.


    Saludos desde Monterrey, Nuevo León, México!!!

    domingo, 23 de julio de 2017 22:26
  • ¿Seguro que el procedimiento de INSERT funciona correctamente enmarcando el nombre de la tabla y columnas entre signos de apóstrofo?, tengo mis dudas.

    Respecto a la consulta de selección, ¿por qué enmarcas el marcador de posición '?' entre corchetes?, no es correcto, de hecho es el único lugar en que "caprichosamente" decidiste encerrar el marcador entre corchetes, fíjate que en las demás consultas no haces lo mismo, ¿algún sustento?. Algo que también noto es un signo de punto y coma ';' al final de la instrucción, ¿es correcto?

    ElseIf a = 4 Then
    	cmd.CommandText = "SELECT * FROM Principal 
    				WHERE Fecha >= ? AND Fecha <= ? ORDER BY Fecha DESC"
    End If


    If a = 4 Then
    	cmd.Parameters.AddWithValue("fi", New DateTime(2017, 5, 1))
    	cmd.Parameters.AddWithValue("ff", New DateTime(2017, 5, 10))
    End If


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 24 de julio de 2017 0:40