c# - 有没有办法创建接受 <= N 参数的参数化查询或存储过程?

标签 c# sqlite parameterized

假设我有一个用于查找项目的搜索屏幕。屏幕上有各种可选的搜索选项,这将导致 SQL 查询语句发生变化。

以下是一些示例搜索:

  1. 描述搜索
  2. 描述搜索 + 项目供应商 ID
  3. 描述搜索 + 项目供应商 ID + 项目层次结构级别 1 ID
  4. 描述搜索 + 项目供应商 ID + 项目层次结构级别 1 id + 级别 2 id
  5. 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/

相关文章:

c# - 如何从 C# 中准确处理 SQL 的批处理分隔符

c# - 如何在 VS2010 C# 控制台应用程序中将我的 App.config 编译成我的 exe?

c# - 检测鼠标是否以圆周方式移动

Android SQLite Exception 没有这样的列

python-3.x - 安装 nltk 包时出现 ModuleNotFoundError : No module named '_sqlite3'

java - 返回具有泛型的对象子类

c# - 如何捕获包含在我的以下代码中的 WINDOWS 用户名?

python - 运行Python参数化测试方法时出错

Java 映射,键 = 类,值 = 该类的实例

android - 我应该在 android sqlite 中使用 "query"+ "update/insert"还是 "insert/replace"?