Frage

Ich ziehe das Haar aus meinem Kopf und versuche diesen herauszufinden.

Ich kann keine parametrisierten Abfragen vornehmen, um in VB.NET zu arbeiten, wenn ich Parameter verwende.

Nach dem, was ich gefunden habe, erhöht die Verwendung eines Parameters in einer Funktion von .NET einen Fehler (siehe Beispielcode). Das Ausführen der nicht funktionierenden Abfrage im Abfragefenster in Visual Studio funktioniert jedoch ordnungsgemäß.

Der aufgeworfene Fehler ist:

25922 - Die Argumente für die Funktion sind nicht gültig.

Info von:http://msdn.microsoft.com/en-us/library/aa256772%28sql.80%29.aspx

Beispielcode:

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
War es hilfreich?

Lösung

Schließlich habe ich die Lösung für dieses Problem gefunden.

Verwenden eines Parameters in einer Funktion stürzt ab, wenn die DBTYPE -Eigenschaft des Parameters nicht festgelegt ist:

Dies wird abstürzen:

    Dim cmd As SqlCeCommand = db.CreateCommand()

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

Wenn Sie einen Parameter in einer Funktion verwenden, funktioniert die DBTYPE -Eigenschaft des Parameters ist einstellen

Das wird funktionieren:

    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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top