2009-12-02 41 views
2

我正在拉出頭來試圖弄清楚這一點。SQLServerCE .NET中的參數化查詢出現的問題

我無法使參數化查詢在VB.Net中工作,當我使用參數。

從我發現的情況來看,在.NET中使用函數中的參數會引發錯誤(請參閱示例代碼)。但是,在Visual Studio中的查詢窗口中運行不工作的查詢正常工作。

引發的錯誤是:

25922 - 爲函數的參數是無效的。

信息來源: http://msdn.microsoft.com/en-us/library/aa256772%28SQL.80%29.aspx

示例代碼:

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 
+0

我沒有看到您的第一個和第二個樣本之間的實質性差異。你指的是什麼「功能」? 。填()? – 2009-12-02 21:57:01

+0

生產代碼中是否存在@nom和@nome差異?或者就在這個例子中? – overslacked 2009-12-02 21:59:19

+0

就在這個例子中,更正 – Martin 2009-12-02 23:18:50

回答

4

最後,我發現這個問題的解決方案。

使用的功能崩潰的參數,如果該參數的DbType屬性未設置:

這將崩潰:

Dim cmd As SqlCeCommand = db.CreateCommand() 

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

使用函數中的參數,如果DBTYPE將工作參數的屬性是

這將工作:

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()