通过数据网格视图搜索值
Searching values via a datagridview
我正在尝试通过在文本框中输入文本来搜索数据库中的特定值,然后使用 SQL 查询数据库,然后在数据网格视图中显示结果。
代码如下:
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSearch.TextChanged
Connection.Open()
Dim dataTable As New DataTable
Dim dataSet As New DataSet
dataSet.Tables.Add(dataTable)
Dim dataAdapter As New OleDbDataAdapter
Dim SQLQuery As String
SQLQuery = <sql>
SELECT *
FROM Students
WHERE StudentFirstName = @StudentFirstName
</sql> .Value
dataAdapter = New OleDbDataAdapter(SQLQuery, Connection)
dataAdapter.SelectCommand.Parameters.Add("@StudentFirstName", SqlDbType.Text).Value = txtStudentFirstname.Text
dataAdapter.Fill(dataTable)
dgrStudentDatabaseViewer.DataSource = dataTable.DefaultView
ShowItems()
Connection.Close()
End Sub
调用 ShowItems() 刷新 datagridview 这里是它的代码
Private Sub ShowItems() ' the following delcleration are used for displaying the contents of the table
Dim dataAdapter As New OleDbDataAdapter
Dim DataTable As New DataTable
Dim DataSet As New DataSet
Dim SQLQuery As String = <sql>SELECT * FROM Students</sql>
DataSet.Tables.Add(DataTable)
dataAdapter = New OleDbDataAdapter(SQLQuery, Connection)
dataAdapter.Fill(DataTable) ' fills the content from the database into the table in vb net
dgrStudentDatabaseViewer.DataSource = DataTable.DefaultView
Connection.Close()
End Sub
目前,当我尝试搜索时没有任何反应,datagridview 的内容保持原样。我认为这可能与我的 SQL 查询的 XML 文字有关,但无法弄清楚。
提前致谢。
您一遍又一遍地创建 New
数据库对象,这是在以您自己的方式行事。如果 DataAdapter
是一个表单级变量,你将不得不写很多代码:
Public Class Form1
' declare some persistant DB objects
Private myDT As DataTable
Private myDA As OleDbDataAdapter
Private myStudentsDataView As DataView
Private dbConnStr As String = "(your connection string)"
这些只是声明的,没有它们的实例(没有 New
)。但是它们被声明的地方决定了Scope
。它们将一直存在直到表单关闭(或者您用 Dim
and/or New
覆盖它们)。表单加载:
' initialize the objects
Dim sql = "SELECT A, B, C, D... FROM Students"
' this is the ONLY place you use NEW
' with these objects
myDT = New DataTable()
' The Adapter can create its own Connection
' and SelectCommand
myDA = New OleDbDataAdapter(sql, dbConnStr)
Dim myCB As New OleDbCommandBuilder(da)
' "teach" the DA how to Update and Add:
myDA.UpdateCommand = myCB.GetUpdateCommand
myDA.InsertCommand = myCB.GetInsertCommand
myDA.DeleteCommand = myCB.GetDeleteCommand
myDA.Fill(myDT)
myDA.FillSchema(myDT, SchemaType.Source)
myStudentsDataView = myDT.DefaultView
dgvStudents.DataSource = myStudentsDataView
DataAdapter
需要一个连接对象才能工作,但正如评论中提到的,而不是显式创建一个,适配器可以创建自己的连接对象。它会根据需要打开和关闭它。 SelectCommand
也是如此——它将根据传递的 SELECT SQL 语句创建自己的语句。
请注意,最好按照您希望列在 DataTable
中出现的顺序指定每一列。重要的是,最后 that DataAdapter
知道如何删除、插入和更新行。只要您不销毁它或更换它,您就不必写任何 SQL 来添加或更改行!
在大多数情况下,DataTable
用作 DGV 的 DataSource
:
myDGV.DataSource = myDT
DGV 将创建所需的列并将数据显示为行。当用户在单元格中键入内容时,这些更改会反映在 DataTable
中,因此无需任何代码将其取出。
如果用户在 DataGridView
中编辑数据,这就是您需要将更改发送回数据库的全部内容:
myDa.Update(myDT)
在这种情况下,根据前面的问题,数据来自文本控件而不是 DGV。所以:
Private Sub AddStudent()
' no need to (RE)create DataAdapter
' add the data to a new row:
Dim dr = myDT.NewRow
dr.Item("FirstName") = textbox1.text
dr.Item("LastName") = textbox2.text
' etc etc
' add the new row to the datatable
myDT.Rows.Add(dr)
' with a persistent DA, this is all you need to add a row:
myDA.Update(myDT)
End Sub
我们"taught" DataAdapter
如何在表单加载中更新一行所以实际上更新数据库(一旦数据在 DT 中)是一行代码:myDA.Update(myDT)
.
DataTable
跟踪每一行是新的、更改的还是删除的,因此 myDA.Update(myDT)
对每一行采取适当的操作。如果系统是多用户的,您可以获取其他用户的更改:
myDa.Fill(myDT)
搜索也很简单:
Private Sub Search(txt As String)
myStudentsDataView.RowFilter = String.Format("LastName = '{0}'", txt)
删除过滤器:
myStudentsDataView = myDT.DefaultView
If/when 您的 DataAdapter
无法添加、插入、更新或删除这意味着您在某处创建了一个 New
。不要那样做。同样 myDataView
将显示 myDT
中的任何内容,直到您创建新的 DT 或 DV 或更改 RowFilter
.
我正在尝试通过在文本框中输入文本来搜索数据库中的特定值,然后使用 SQL 查询数据库,然后在数据网格视图中显示结果。
代码如下:
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSearch.TextChanged
Connection.Open()
Dim dataTable As New DataTable
Dim dataSet As New DataSet
dataSet.Tables.Add(dataTable)
Dim dataAdapter As New OleDbDataAdapter
Dim SQLQuery As String
SQLQuery = <sql>
SELECT *
FROM Students
WHERE StudentFirstName = @StudentFirstName
</sql> .Value
dataAdapter = New OleDbDataAdapter(SQLQuery, Connection)
dataAdapter.SelectCommand.Parameters.Add("@StudentFirstName", SqlDbType.Text).Value = txtStudentFirstname.Text
dataAdapter.Fill(dataTable)
dgrStudentDatabaseViewer.DataSource = dataTable.DefaultView
ShowItems()
Connection.Close()
End Sub
调用 ShowItems() 刷新 datagridview 这里是它的代码
Private Sub ShowItems() ' the following delcleration are used for displaying the contents of the table
Dim dataAdapter As New OleDbDataAdapter
Dim DataTable As New DataTable
Dim DataSet As New DataSet
Dim SQLQuery As String = <sql>SELECT * FROM Students</sql>
DataSet.Tables.Add(DataTable)
dataAdapter = New OleDbDataAdapter(SQLQuery, Connection)
dataAdapter.Fill(DataTable) ' fills the content from the database into the table in vb net
dgrStudentDatabaseViewer.DataSource = DataTable.DefaultView
Connection.Close()
End Sub
目前,当我尝试搜索时没有任何反应,datagridview 的内容保持原样。我认为这可能与我的 SQL 查询的 XML 文字有关,但无法弄清楚。
提前致谢。
您一遍又一遍地创建 New
数据库对象,这是在以您自己的方式行事。如果 DataAdapter
是一个表单级变量,你将不得不写很多代码:
Public Class Form1
' declare some persistant DB objects
Private myDT As DataTable
Private myDA As OleDbDataAdapter
Private myStudentsDataView As DataView
Private dbConnStr As String = "(your connection string)"
这些只是声明的,没有它们的实例(没有 New
)。但是它们被声明的地方决定了Scope
。它们将一直存在直到表单关闭(或者您用 Dim
and/or New
覆盖它们)。表单加载:
' initialize the objects
Dim sql = "SELECT A, B, C, D... FROM Students"
' this is the ONLY place you use NEW
' with these objects
myDT = New DataTable()
' The Adapter can create its own Connection
' and SelectCommand
myDA = New OleDbDataAdapter(sql, dbConnStr)
Dim myCB As New OleDbCommandBuilder(da)
' "teach" the DA how to Update and Add:
myDA.UpdateCommand = myCB.GetUpdateCommand
myDA.InsertCommand = myCB.GetInsertCommand
myDA.DeleteCommand = myCB.GetDeleteCommand
myDA.Fill(myDT)
myDA.FillSchema(myDT, SchemaType.Source)
myStudentsDataView = myDT.DefaultView
dgvStudents.DataSource = myStudentsDataView
DataAdapter
需要一个连接对象才能工作,但正如评论中提到的,而不是显式创建一个,适配器可以创建自己的连接对象。它会根据需要打开和关闭它。 SelectCommand
也是如此——它将根据传递的 SELECT SQL 语句创建自己的语句。
请注意,最好按照您希望列在 DataTable
中出现的顺序指定每一列。重要的是,最后 that DataAdapter
知道如何删除、插入和更新行。只要您不销毁它或更换它,您就不必写任何 SQL 来添加或更改行!
在大多数情况下,DataTable
用作 DGV 的 DataSource
:
myDGV.DataSource = myDT
DGV 将创建所需的列并将数据显示为行。当用户在单元格中键入内容时,这些更改会反映在 DataTable
中,因此无需任何代码将其取出。
如果用户在 DataGridView
中编辑数据,这就是您需要将更改发送回数据库的全部内容:
myDa.Update(myDT)
在这种情况下,根据前面的问题,数据来自文本控件而不是 DGV。所以:
Private Sub AddStudent()
' no need to (RE)create DataAdapter
' add the data to a new row:
Dim dr = myDT.NewRow
dr.Item("FirstName") = textbox1.text
dr.Item("LastName") = textbox2.text
' etc etc
' add the new row to the datatable
myDT.Rows.Add(dr)
' with a persistent DA, this is all you need to add a row:
myDA.Update(myDT)
End Sub
我们"taught" DataAdapter
如何在表单加载中更新一行所以实际上更新数据库(一旦数据在 DT 中)是一行代码:myDA.Update(myDT)
.
DataTable
跟踪每一行是新的、更改的还是删除的,因此 myDA.Update(myDT)
对每一行采取适当的操作。如果系统是多用户的,您可以获取其他用户的更改:
myDa.Fill(myDT)
搜索也很简单:
Private Sub Search(txt As String)
myStudentsDataView.RowFilter = String.Format("LastName = '{0}'", txt)
删除过滤器:
myStudentsDataView = myDT.DefaultView
If/when 您的 DataAdapter
无法添加、插入、更新或删除这意味着您在某处创建了一个 New
。不要那样做。同样 myDataView
将显示 myDT
中的任何内容,直到您创建新的 DT 或 DV 或更改 RowFilter
.