假设我有一个用于查找项目的搜索屏幕。屏幕上有各种可选的搜索选项,这将导致 SQL 查询语句发生变化。
以下是一些示例搜索:
- 描述搜索
- 描述搜索 + 项目供应商 ID
- 描述搜索 + 项目供应商 ID + 项目层次结构级别 1 ID
- 描述搜索 + 项目供应商 ID + 项目层次结构级别 1 id + 级别 2 id
- item hierarchy level 1 id + level 2 id (no description, no item supplier id)
...你明白了。有相当多的可能组合。我希望使用参数化查询来获得性能优势等(另外我将它们用于整个程序的其余查询)。
有没有办法做到这一点,或者我是否被迫创建每个可能的查询和匹配的 SQLiteCommand 对象,或者根据所选选项使用 StringBuilder 动态构建查询字符串?
我正在使用 SQLite.NET 数据提供程序和 C# 3.0(在 3.5 紧凑框架上)。
更新
根据一些使用 null 默认值的参数和使用 (@param isnull or column = @param)
的建议,我想我应该能够让它工作。我会及时通知你。
注意:我避免使用存储过程,因为其余代码使用参数化查询而不是存储过程。为了 future 维护程序员的理智,我想让一切保持一致。无论如何,它应该不会有太大的不同。
更新 2
这在桌面系统(这是我对查询进行初始测试的地方)上非常好。但是,它在我使用的 Windows CE 设备上非常慢。慢得无法使用。尽管如此,我将来肯定可以使用它,而且非常方便。只是在移动设备上运行查询时不会。
谢谢
最佳答案
从存储过程端,您可以将默认值设置为 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
关于c# - 有没有办法创建接受 <= N 参数的参数化查询或存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1133118/