Pergunta

Estou puxando o cabelo da minha cabeça tentando descobrir isso.

Não posso fazer consultas parametrizadas para trabalhar no vb.net, quando estou usando parâmetros.

Pelo que encontrei, usando um parâmetro em uma função, do .NET levanta um erro (consulte o código de amostra). No entanto, a execução da consulta que não está funcionando na janela de consulta no Visual Studio funciona corretamente.

O erro levantado é:

25922 - Os argumentos para função não são válidos.

Informação de:http://msdn.microsoft.com/en-us/library/aa256772%28sql.80%29.aspx

Código de amostra:

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
Foi útil?

Solução

Finalmente, encontrei a solução para esse problema.

Usando um parâmetro em uma função trava se a propriedade DBTYPE do parâmetro não estiver definida:

Isso vai cair:

    Dim cmd As SqlCeCommand = db.CreateCommand()

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

Usar um parâmetro em uma função funcionará se a propriedade DBTYPE do parâmetro é definir

Isso vai funcionar:

    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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top