C# 是否有方法创建接受<;=N参数?
假设我有一个用于查找项目的搜索屏幕。屏幕上有各种可选的搜索选项,这些选项将导致SQL查询语句发生变化 以下是一些示例搜索:C# 是否有方法创建接受<;=N参数?,c#,sqlite,parameterized,C#,Sqlite,Parameterized,假设我有一个用于查找项目的搜索屏幕。屏幕上有各种可选的搜索选项,这些选项将导致SQL查询语句发生变化 以下是一些示例搜索: 描述搜索 描述搜索+项目供应商id 描述搜索+项目供应商id+项目层次结构级别1 id 描述搜索+项目供应商id+项目层次结构级别1 id+级别2 id 物料层次结构级别1 id+级别2 id(无描述,无物料供应商id) …你明白了。有很多可能的组合。我希望使用参数化查询来获得性能优势等(另外,我在整个程序的其余查询中也使用了参数化查询) 有没有办法做到这一点,或者我是被迫
更新 基于一些参数默认值为null的建议,并使用
(@param isnull或column=@param)
,我认为我应该能够实现这一点。我会通知你的
注意:我避免使用存储过程,因为代码的其余部分使用参数化查询而不是存储过程。为了未来维护程序员的头脑清醒,我希望保持一切一致。无论如何,这不会有太大的区别
更新2 这在桌面系统上运行得很好(这是我对查询进行初始测试的地方)。但是,在我使用的Windows CE设备上速度非常慢。极其缓慢。尽管如此,我将来肯定可以使用它,而且它非常方便。但在移动设备上运行查询时,情况并非如此
感谢您为每种情况创建存储过程
如果在使用StringBuilder构建的c#中有内联SQL代码,则执行计划将永远不会被缓存,并且不会像存储过程那样执行。您可以指定参数默认值并处理存储过程中的逻辑:
create procedure mySproc(@description nvarchar(20) = null, @supplierid int = null, etc...)
处理存储过程主体中参数是否为null的逻辑。从存储过程端,可以将默认值设置为null,然后构建where子句以容纳此null值
ALTER Procedure FooProcedure
@SupplierID INT = NULL,
@LevelOne INT = NULL
AS
BEGIN
SELECT SupplierID, LevelOne
FROM FooTable
WHERE @SupplierID IS NULL OR SupplierID = @SupplierID
AND @LevelOne IS NULL OR LevelOne = @LevelOne
END
这就是我创建参数化查询的原因。它们也被缓存。我有一个SQLiteCommand对象,它有自己的一组SQLiteParameter对象,所以一旦查询运行,它应该被缓存。问题是要使用这种方法,我需要为每个可能的搜索组合使用一个。我认为使用存储过程会遇到同样的问题。。。我将需要一个为每个可能的搜索组合。这就是我试图避免的。缓存执行计划是否也存在,还是仅仅是数据?我的印象是,这是整个执行计划(我可能是错的)。这是我找到的最好的文章,但似乎对解释持开放态度。这正是我试图做的,但使用任意数量的参数进行操作。我想我现在有了一种方法,它基于存储过程和默认值中提到的一些想法。我将通过给我的SQLiteParameter对象一个默认值null来模拟它。我将向您展示如何动态构建查询,但是参数注入警察会在我后面。问题的标题是可变参数数。但是您似乎需要一个SP,它有N个参数,但可以接受N个或