我创建了一个项目列表,其中加载了所有项目,我需要根据文本框中输入的文本过滤数据。请指导我如何过滤和排序数据,我创建了以下代码
Private Sub loadsearchitems(item As String)
dgvsearchitem.ScrollBars = ScrollBars.Vertical
On Error Resume Next
con = New System.Data.OleDb.OleDbConnection(connectionString)
con.Open()
Dim ds As DataSet = New DataSet
Dim adapter As New OleDb.OleDbDataAdapter
sqlstr = "SELECT Imaster.icode, Imaster.iname & ' ' & MfgComTab.comname as[Iname], Imaster.unitcode, Imaster.tax,Unit.unitname FROM ((Imaster INNER JOIN MfgComTab ON Imaster.mccode = MfgComTab.mccode) INNER JOIN Unit ON Imaster.unitcode = Unit.unitcode) WHERE (Imaster.isdeleted = 'N') AND Imaster.comcode=@comcode AND Imaster.iname like '%' & @item & '%' order by iname asc "
adapter.SelectCommand = New OleDb.OleDbCommand(sqlstr, con)
adapter.SelectCommand.Parameters.AddWithValue("@comcode", compcode)
adapter.SelectCommand.Parameters.AddWithValue("@iname", item)
adapter.Fill(ds)
If ds.Tables(0).Rows.Count > 0 Then
dgvsearchitem.DataSource = ds.Tables(0)
dgvsearchitem.Columns("unitname").Visible = False
dgvsearchitem.Columns("unitcode").Visible = False
dgvsearchitem.Columns("icode").Visible = False
dgvsearchitem.Columns("tax").Visible = False
dgvsearchitem.Columns("Iname").Width = 371
Else
ds.Dispose()
End If
con.Close()
End Sub
但是在上面的代码中,应用程序很慢,因为每次输入任何文本时都会执行查询。请告诉我查询只执行一次的任何解决方案,当我们输入文本时,它只通过通配符搜索项目并过滤它。
如果您最初使用所有记录设置DataGridView,那么您可以避免再次访问数据库以过滤的方式提取数据。您已经提取了所有内容,因此您可以简单地使用本地过滤的DataView设置数据源
' Code that loads initially the grid
sqlstr = "SELECT Imaster.icode, Imaster.iname .....FROM ...." ' NO WHERE HERE
....
dgvsearchitem.DataSource = ds.Tables(0).DefaultView
现在在你的loadsearchitems
,而不是再次执行对数据库的查询,你可以采取数据源和设置RowFilter属性
Dim v as DataView = CType(dgvsearchitem.DataSource, DataView)
v.RowFilter = "Imaster.comcode='" & compcode & "' AND Imaster.iname like '%" & item & "'%'"
注意RowFilter
属性不理解参数的使用,所以如果你的comcode
字段可能包含单引号,你需要添加某种形式的双引号(字符串)。Replace就行了),以避免语法错误。是的,没有担心Sql注入对DataView(它是一个断开连接的对象,无论你的用户类型在compcode字段它不能到达数据库)