4

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

以下是一些示例搜索:

  1. 描述搜索
  2. 描述搜索 + 项目供应商 ID
  3. 描述搜索 + 项目供应商 ID + 项目层次结构级别 1 id
  4. 描述搜索 + 项目供应商 ID + 项目层次结构级别 1 id + 级别 2 id
  5. 项目层次结构级别 1 id + 级别 2 id(无描述,无项目供应商 ID)

...你明白了。有很多可能的组合。我希望使用参数化查询来获得性能优势等(另外我将它们用于整个程序的其余查询)。

有没有办法做到这一点,或者我是否被迫创建每个可能的查询和匹配的 SQLiteCommand 对象,或者根据所选选项使用 StringBuilder 动态构建查询字符串?

我正在使用带有 C# 3.0 的 SQLite.NET 数据提供程序(在 3.5 紧凑框架上)。


更新

基于参数和 using 的默认值为 null 的一些建议(@param isnull or column = @param),我想我应该能够让它工作。我会及时向大家发布。

注意:我避免使用存储过程,因为其余代码使用参数化查询而不是存储过程。为了将来维护程序员的理智,我想保持一切一致。无论如何,它不应该有太大的不同。


更新 2

这在桌面系统上效果很好(这是我对查询进行初始测试的地方)。但是,在我使用的 Windows CE 设备上它非常慢。慢得无法使用。尽管如此,我绝对可以在将来使用它,它非常方便。只是在移动设备上运行查询时不会。

谢谢

4

3 回答 3

4

从存储过程方面,您可以将默认值设置为 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
于 2009-07-15T18:39:45.437 回答
1

您可以为参数分配默认值并处理存储过程中的逻辑:

create procedure mySproc(@description nvarchar(20) = null, @supplierid int = null, etc...)

处理sproc主体中参数是否为null的逻辑。

于 2009-07-15T18:39:25.313 回答
0

您最好为每种情况创建存储过程。

如果您在使用 StringBuilder 构建的 c# 中有内联 SQL 代码,那么执行计划将永远不会被缓存,并且它的性能不会像存储过程那样好。

于 2009-07-15T18:35:28.380 回答