Question

Je tire les cheveux de ma tête en essayant de comprendre celui-ci.

Je ne peux pas faire des requêtes paramétrées pour fonctionner dans VB.NET, lorsque j'utilise des paramètres.

D'après ce que j'ai trouvé, en utilisant un paramètre dans une fonction, à partir de .NET soulève une erreur (voir un exemple de code). Cependant, l'exécution de la requête non fonctionnelle dans la fenêtre de requête dans Visual Studio fonctionne correctement.

L'erreur soulevée est:

25922 - Les arguments de fonction ne sont pas valides.

Informations de:http://msdn.microsoft.com/en-us/library/AA25677%28SQL.80%29.aspx

Exemple de code:

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
Était-ce utile?

La solution

Enfin, j'ai trouvé la solution pour ce problème.

L'utilisation d'un paramètre dans une fonction plante si la propriété DBType du paramètre n'est pas définie:

Cela va planter:

    Dim cmd As SqlCeCommand = db.CreateCommand()

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

L'utilisation d'un paramètre dans une fonction fonctionnera si la propriété DBTYPE du paramètre est Positionner

Cela fonctionnera:

    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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top