VB.net 使用两个参数的搜索查询
VB.net Search Query using two parameters
我在 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)
第一个参数是包含 table 中所有列的下拉组合框,第二个参数是输入文本框。
但是每当我尝试搜索时,什么也不会出现。
似乎是什么问题?我真的很想实现这种搜索功能。提前致谢。
假设您有一个组合过滤器,将 ID
另存为 @par1
并将文本字段另存为 @par2
组合具有以下值:
- none (id: -999)
- field1 (id: 0)
- field2 (id: 1)
Not sure about how you set your parameter so I will use some pseudo code.
您可以通过技巧来动态设置要使用的过滤器。
SELECT *
FROM Inventory_Table
WHERE
(Field1 = @par2 and 0 = @par1)
OR (Field2 = @par2 and 1 = @par1)
OR (-999 = @par1)
因此,如果您 select Field1
则 0 = @par1
将为真,第一个过滤器将处于活动状态
如果你 select Field2
那么 1 = @par1
将为真并且第二个过滤器将被激活
如果 none
是 select 所有行都是 return。
在此您可以使用动态代码
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 没有一些特殊字符。
我在 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)
第一个参数是包含 table 中所有列的下拉组合框,第二个参数是输入文本框。
但是每当我尝试搜索时,什么也不会出现。 似乎是什么问题?我真的很想实现这种搜索功能。提前致谢。
假设您有一个组合过滤器,将 ID
另存为 @par1
并将文本字段另存为 @par2
组合具有以下值:
- none (id: -999)
- field1 (id: 0)
- field2 (id: 1)
Not sure about how you set your parameter so I will use some pseudo code.
您可以通过技巧来动态设置要使用的过滤器。
SELECT *
FROM Inventory_Table
WHERE
(Field1 = @par2 and 0 = @par1)
OR (Field2 = @par2 and 1 = @par1)
OR (-999 = @par1)
因此,如果您 select Field1
则 0 = @par1
将为真,第一个过滤器将处于活动状态
如果你 select Field2
那么 1 = @par1
将为真并且第二个过滤器将被激活
如果 none
是 select 所有行都是 return。
在此您可以使用动态代码
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 没有一些特殊字符。