Pregunta

Estoy tirando del pelo de la cabeza tratando de la forma de saberlo.

No puedo realizar consultas con parámetros para trabajar en VB.Net, cuando estoy usando parámetros.

Por lo que he encontrado, usando un parámetro en una función, a partir de .NET genera un error (ver código de ejemplo). Sin embargo, ejecutar la consulta que no trabajan en la ventana de consulta en el estudio visual funciona correctamente.

El error generado es:

  

25922 - Los argumentos para la función no son válidos

.

Información de: http://msdn.microsoft.com/en- es / library / aa256772% 28SQL.80% 29.aspx

Código de ejemplo:

Imports System.Data.SqlServerCe

Public Class MiniDemo

    Public Shared Sub Main()
        Dim cs As String = "Data Source=Inventory.sdf; Persist Security Info=False;"
        Dim db As New SqlCeConnection(cs)
        db.Open()


        ''#Using parameters works
        Dim cmd As SqlCeCommand = db.CreateCommand()

        cmd.CommandText = "INSERT INTO inventory_type (inv_type_id, inv_type_name) VALUES (@id, @name)"
        cmd.Parameters.Add("@id", 1)
        cmd.Parameters.Add("@name", "test")
        cmd.ExecuteNonQuery()



        ''#Using parameters in functions does not work
        Dim cmd2 As SqlCeCommand = db.CreateCommand()

            ''#Broken on multiple lines for readability (built using string builders in real code)
        cmd2.CommandText = 
                     "SELECT 
                        inv_type_id, 
                        inv_type_name 
                      FROM
                        inventory_type 
                      WHERE 
                        ((@id IS NULL) OR (inv_type_id = @id)) AND 
                        ((@name IS NULL) OR (inv_type_name = @name))"

        cmd2.Parameters.Add("@id", 1)
        cmd2.Parameters.Add("@name", "test") ''# Would not work with DBNull.Value either

        Dim da2 As New SqlCeDataAdapter(cmd2)
        Dim dt2 As New DataTable()
        da2.Fill(dt2)
        db.Close()
    End Sub

End Class
¿Fue útil?

Solución

Por último, he encontrado la solución para este problema.

Uso de un parámetro en una función bloquea si la propiedad DbType del parámetro no se establece:

Esto se colgará:

    Dim cmd As SqlCeCommand = db.CreateCommand()

    cmd.CommandText = "SELECT COALESCE(@param1, @param2);"
    cmd.Parameters.Add("@param1", 1)
    cmd.Parameters.Add("@param2", "test")
    cmd.ExecuteScalar()

El uso de un parámetro en una función funcionará si la propiedad DbType del parámetro es set

Esto funciona:

    Dim cmd As SqlCeCommand = db.CreateCommand()

    cmd.CommandText = "SELECT COALESCE(@param1, @param2);"
    cmd.Parameters.Add("@param1", 1).DbType = DbType.Int32
    cmd.Parameters.Add("@param2", "test").DbType = DbType.String
    cmd.ExecuteScalar()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top