来自.NET的参数化查询的SQLServerCE问题
我想弄清楚这件事,真是让人毛骨悚然 当我使用参数时,我不能使参数化查询在VB.Net中工作 根据我所发现的,在函数中使用参数From.NET会引发一个错误(请参见示例代码)。但是,在VisualStudio的“查询”窗口中运行“不工作”查询可以正常工作 引发的错误是: 25922-函数的参数无效 信息来源: 示例代码:来自.NET的参数化查询的SQLServerCE问题,.net,sql-server-ce,parameterized-query,.net,Sql Server Ce,Parameterized Query,我想弄清楚这件事,真是让人毛骨悚然 当我使用参数时,我不能使参数化查询在VB.Net中工作 根据我所发现的,在函数中使用参数From.NET会引发一个错误(请参见示例代码)。但是,在VisualStudio的“查询”窗口中运行“不工作”查询可以正常工作 引发的错误是: 25922-函数的参数无效 信息来源: 示例代码: Imports System.Data.SqlServerCe Public Class MiniDemo Public Shared Sub Main()
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
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属性,则在函数中使用参数会崩溃: 这将崩溃:
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
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()
我看不出你们的第一个和第二个样品之间有实质性的区别。你指的是什么“功能”。Fill()?生产代码中是否存在@nom和@nome差异?或者就在这个例子中?就在这个例子中,corrected@Joel:2之间的区别是,第二个失败是因为is NULL(它在幕后转换为ISNULL(@id),COALESCE(@id,0)=0)将产生相同的错误。您是否尝试过
inv\u type\u name=COALESCE(@name,inv\u type\u name)
(参数值为DBNull.Value)?