Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有方法创建接受<;=N参数?_C#_Sqlite_Parameterized - Fatal编程技术网

C# 是否有方法创建接受<;=N参数?

C# 是否有方法创建接受<;=N参数?,c#,sqlite,parameterized,C#,Sqlite,Parameterized,假设我有一个用于查找项目的搜索屏幕。屏幕上有各种可选的搜索选项,这些选项将导致SQL查询语句发生变化 以下是一些示例搜索: 描述搜索 描述搜索+项目供应商id 描述搜索+项目供应商id+项目层次结构级别1 id 描述搜索+项目供应商id+项目层次结构级别1 id+级别2 id 物料层次结构级别1 id+级别2 id(无描述,无物料供应商id) …你明白了。有很多可能的组合。我希望使用参数化查询来获得性能优势等(另外,我在整个程序的其余查询中也使用了参数化查询) 有没有办法做到这一点,或者我是被迫

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

以下是一些示例搜索:

  • 描述搜索
  • 描述搜索+项目供应商id
  • 描述搜索+项目供应商id+项目层次结构级别1 id
  • 描述搜索+项目供应商id+项目层次结构级别1 id+级别2 id
  • 物料层次结构级别1 id+级别2 id(无描述,无物料供应商id)
  • …你明白了。有很多可能的组合。我希望使用参数化查询来获得性能优势等(另外,我在整个程序的其余查询中也使用了参数化查询)

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

    我正在将SQLite.NET数据提供程序与C#3.0(在3.5精简框架上)结合使用


    更新

    基于一些参数默认值为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个或