【问题标题】:VB.net Search Query using two parametersVB.net Search Query 使用两个参数
【发布时间】:2015-12-15 22:07:55
【问题描述】:

我在 VB.net 中使用具有两个参数的数据源创建了一个搜索查询。

SELECT        [Product Code], Description, Input_Date, Price, Unit, Quantity, Markup, Total
FROM            Inventory_Table
WHERE        (? = ?)

我做了两个参数,因为我想按特定列搜索,这就是我使用查询的方式:

  Inventory_TableTableAdapter.SearchQuery(DBDataSet1.Inventory_Table, InvSearchCombo.Text, InvSearchTxt.Text)

第一个参数是包含表中所有列的下拉组合框,第二个参数是输入文本框。

但是每当我尝试搜索时,什么都不会出现。 似乎是什么问题?我真的很想实现这种搜索功能。提前致谢。

【问题讨论】:

  • 您不能将字段名称设置为参数。您应该改为创建一个动态 sql。解析字符串
  • 这是否意味着我需要对每个字段名称进行单独的查询?
  • 您的标题与您的解释不符,我的意思是,您的标题,可能是 VB.net Search Query using dynamic attritube in where 子句之类的。
  • @MarcIntes,你找到答案了吗?

标签: sql database vb.net datasource


【解决方案1】:

在这你可以使用动态代码

Dim columnQuery As String = "Description"

Using command As New SqlCommand( "select Description,Input_Date from dep where " &  columnQuery  & " = @par1", connection)

command.Parameters.AddWithValue("@par1", "descripcion")

End using

编辑

更好的形式可能是这样的:

首先,创建存储过程:

CREATE PROCEDURE SP_LIST_TABLA_BY_DYNAMIC_COLUMN
@PAR_COLUMN VARCHAR(20),
@PAR_VALUE VARCHAR(20)
AS

DECLARE @STRSQL NVARCHAR(MAX)

SET @STRSQL  = 'SELECT PRODUCT_CODE,DESCRIP,INPUT_DATE FROM INVENTORY_TABLE WHERE ' + @PAR_COLUMN + ' = ' + @PAR_VALUE

EXEC sp_executesql @STRSQL

然后调用它:

Using command As New SqlCommand( "SP_LIST_TABLA_BY_DYNAMIC_COLUMN", connection)
    command.CommandType = CommandType.StoredProcedure
    command.Parameters.AddWithValue("@PAR_COLUMN", "product_code")
    command.Parameters.AddWithValue("@PAR_VALUE", "1")

    Using reader As SqlDataReader = command.ExecuteReader()
        While reader.Read() 


    End While
    End using

End using

但就像用户 @Basic 所说:如果列名来自用户输入(即使通过数据库),那么您将容易受到 SQL 注入攻击

一个建议可能是评估 par_column 名称存在并且 par_value 没有一些特殊字符。

【讨论】:

  • 但请注意,如果列名来自用户输入(即使通过数据库),那么您将容易受到 SQL 注入攻击。例如,想象一下如果输入的列名是1=1; DROP TABLE dep;--(显然不要这样做)
【解决方案2】:

假设您有一个组合过滤器并将ID 保存为@par1,文本字段另存为@par2

Combo 有这个值:

  • 无(ID:-999)
  • field1 (id: 0)
  • field2 (id: 1)

不确定你是如何设置参数的,所以我将使用一些伪代码。

您可以制作一个技巧来动态设置要使用的过滤器。

SELECT  *
FROM    Inventory_Table
WHERE        
    (Field1 = @par2 and 0 = @par1)
OR  (Field2 = @par2 and 1 = @par1)
OR  (-999 = @par1)

因此,如果您选择Field1,那么0 = @par1 将为真,第一个过滤器将处于活动状态

如果您选择Field2,那么1 = @par1 将为真,第二个过滤器将处于活动状态

如果none 是选择所有行,则返回。

【讨论】:

  • 他的问题更多是关于动态属性作为参数,他的标题与他的解释不符。
  • Hola @JuanRuizdeCastilla,不确定是否与标题不匹配,但符合文本要求。他想从组合框中选择fieldName,然后过滤那个fieldName
  • 你好,同名:),你确定吗?如果两个参数嵌套,他会在 where 子句中独立讨论动态属性。
  • 托卡约胡安我 95% 确定。没有看到关于动态属性的 OP 问题的任何提及。我以前见过这样的问题。只是在表中搜索。问题是该字段是从组合框中选择的。我认为我的解决方案会有所帮助。
  • @JuanCarlosOropeza OP 没有提到动态列名,因为他不知道这是他需要的(显然)。根据问题和他的示例代码,他需要第一个参数是要搜索的列,第二个参数是要搜索的值。
猜你喜欢
  • 1970-01-01
  • 2017-10-16
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
相关资源
最近更新 更多