如何从文本框中搜索数据并从 SQL 数据库中填充 datagridview 的特定列?
How to search data from textbox and fill specific columns of datagridview from SQL database?
我正在尝试通过在文本框中键入来搜索项目代码,我想从 SQL 数据库中获取同一行中的特定列。我在 datagridview 中创建了带有 headers 的列,我希望在特定的 datagridview 列中搜索到数据。我写了代码,但它不工作。我不知道该怎么做。我是新手,正在努力学习 vb。请给点建议。
这是我的代码:
Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click
Using cn As New SqlConnection("server= PANKAJ\SQLEXPRESS; database = pankaj billing software; integrated security=true")
Using cmd2 As New SqlCommand("select itemcode As 'Item Code', item,qty As Quantity, weight as Weight from stockdata Where itemcode = @itemcode;", cn)
cmd2.Parameters.AddWithValue("@itemcode", TextBox1.Text)
cn.Open()
Dim dr As SqlDataReader = cmd2.ExecuteReader()
dt.Load(dr)
DataGridView1.DataSource = dt
For Each row As DataGridViewRow In DataGridView1.Rows
cmd2.Parameters.Add("@item", SqlDbType.VarChar)
cmd2.Parameters.Add("@qty", SqlDbType.VarChar)
cmd2.Parameters.Add("@weight", SqlDbType.VarChar)
With cmd2
row.Cells(1).Value = .Parameters("@item").Value
row.Cells(2).Value = .Parameters("@qty").Value
row.Cells(2).Value = .Parameters("@weight").Value
End With
cmd2.ExecuteNonQuery()
Next
End Using
End Using
End Sub
我使用位于 DataGridView 外部的 TextBox 输入要搜索的项目代码。我添加了一个按钮来进行搜索并将数据检索到 DataReader。
DataReader 然后加载声明为表单级别(class 级别变量)的 DataTable。我们希望每次搜索时都使用相同的 DataTable,以便将项目添加到网格中。使用 Load 方法,如果 DataTable 已包含行,则来自数据源的传入数据将与现有行合并。然后将 DataTable 绑定到 DataGridView。每次用户在文本框中输入项目代码并单击搜索按钮时,都会在网格中添加一个新行。
为了使列 header 看起来更漂亮,请在您的 Select 语句中用作别名。数据库列名称后面的 As 子句是别名,将在 DataGridView 中显示为 header。如果您的别名中有 space,则必须用单引号括起来。
Private dt As DataTable
Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
dt = New DataTable()
End Sub
Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
Using cn As New SqlConnection("server= PANKAJ\SQLEXPRESS; database = pankaj billing software; integrated security=true")
Using cmd2 As New SqlCommand("select itemcode As 'Item Code', item,qty As Quantity, weight as Weight from stockdata Where itemcode = @itemcode;", cn)
cmd2.Parameters.AddWithValue("@itemcode", txtItemCode.Text)
cn.Open()
Dim dr As SqlDataReader = cmd2.ExecuteReader()
dt.Load(dr)
DataGridView1.DataSource = dt
End Using
End Using
End Sub
P.S。很高兴看到参数的使用和Using blocks! :-)
这个怎么样?
'"C:\your_path\Northwind.mdb"
Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Windows.Forms
Public Class Form1
Inherits System.Windows.Forms.Form
Private bindingSource1 As New BindingSource()
Private dataAdapter As New OleDbDataAdapter()
<STAThreadAttribute()> _
Public Shared Sub Main()
Application.Run(New Form1())
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\your_path\Northwind.mdb"
Dim selectCommand As String
Dim connection As New OleDbConnection(connectionString)
selectCommand = "Select * From MyExcelTable ORDER BY ID"
Me.dataAdapter = New OleDbDataAdapter(selectCommand, connection)
With DataGridView1
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader
End With
Dim commandBuilder As New OleDbCommandBuilder(Me.dataAdapter)
Dim table As New DataTable()
table.Locale = System.Globalization.CultureInfo.InvariantCulture
Me.dataAdapter.Fill(table)
Me.bindingSource1.DataSource = table
Dim data As New DataSet()
data.Locale = System.Globalization.CultureInfo.InvariantCulture
DataGridView1.DataSource = Me.bindingSource1
Me.DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Aqua
Me.DataGridView1.AutoResizeColumns( _
DataGridViewAutoSizeColumnsMode.AllCells)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, btnUpdate.Click
Dim table As New DataTable()
Me.bindingSource1 = Me.DataGridView1.DataSource
table = Me.bindingSource1.DataSource
Me.dataAdapter.Update(table)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click, btnClose.Click
Me.Close()
End Sub
Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged, TextBox1.Click
Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\your_path\Northwind.mdb"
Dim selectCommand As String
Dim connection As New OleDbConnection(connectionString)
'selectCommand = "Select * From MyExcelTable where Fname = '" & TextBox1.Text & "'"
'"SELECT * FROM Customers WHERE Address LIKE '" & strAddressSearch & "%'"
'or ending with:
'"SELECT * FROM Customers WHERE Address LIKE '%" & strAddressSearch & "'"
selectCommand = "Select * From MyExcelTable where Fname Like '%" & TextBox1.Text & "%'"
Me.dataAdapter = New OleDbDataAdapter(selectCommand, connection)
With DataGridView1
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader
End With
Dim commandBuilder As New OleDbCommandBuilder(Me.dataAdapter)
Dim table As New DataTable()
table.Locale = System.Globalization.CultureInfo.InvariantCulture
Me.dataAdapter.Fill(table)
Me.bindingSource1.DataSource = table
Dim data As New DataSet()
data.Locale = System.Globalization.CultureInfo.InvariantCulture
DataGridView1.DataSource = Me.bindingSource1
Me.DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Aqua
Me.DataGridView1.AutoResizeColumns( _
DataGridViewAutoSizeColumnsMode.AllCells)
End Sub
End Class
我看到了几件事要检查:
- 当您使用数据源时,您不需要遍历 reader.
的行
- 检查连接字符串("pankaj billing software" 真的是数据库的名称吗?他们通常没有空格)
- SQL 语句中的列名称需要方括号(
[]
或双引号 "
)而不是单引号('
)。
- 最好避免使用
AddWithValue()
函数,而使用确切的列类型和长度调用 Add()
。
- 我们没有看到
dt
在哪里声明。
把它们放在一起(在 name/length 列猜测,还没有更改数据库名称),你会得到这个:
Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click
Dim sql = "select itemcode As [Item Code], item, qty As Quantity, weight as Weight from stockdata Where itemcode = @itemcode;"
Dim dt As New DataTable()
Using cn As New SqlConnection("server=PANKAJ\SQLEXPRESS;database=pankaj billing software;integrated security=true"), _
cmd2 As New SqlCommand(sql, cn)
cmd2.Parameters.Add("@itemcode", SqlDbType.NVarChar, 10).Value = TextBox1.Text
cn.Open()
Using dr As SqlDataReader = cmd2.ExecuteReader()
dt.Load(dr)
End Using
End Using
DataGridView1.DataSource = dt
End Sub
但重要的是 "Not working" 从来没有 足够的关于您的代码的信息。你实际看到了什么与你预期的不同?如果有错误消息,它具体说了什么?
这是我的脚本代码:
protected void search_click(object sender, EventArgs e)
{
SqlConnection sqlCon = new SqlConnection(conn);
if (sqlCon.State == ConnectionState.Closed)
sqlCon.Open();
SqlCommand cmd = new SqlCommand("spSearchUser", sqlCon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@SearchTerm", "username");
cmd.Parameters.AddWithValue("@Username", txtSearch.Text);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
dr.Read();
searchBind();
GridView1.Visible = true;
txtSearch.Text = "";
}
}
这是 WebForm 代码:
<div>
<table>
<tr>
<td>Search</td>
<td>
<asp:TextBox ID="txtSearch" runat="server"></asp:TextBox>
</td>
<td>
<asp:Button ID="btnSearch" runat="server" Text="Go" onclick="search_click" />
</td>
</tr>
</table>
<asp:GridView ID="GridView1" runat="server"></asp:GridView>
</div>
这是我的存储过程:
alter procedure spSearchUser
(
@SearchTerm nvarchar(50),
@Username nvarchar(50)
)
as
begin
set nocount on;
if @SearchTerm = 'username'
begin
select Username,City,Gender,Email from tblRegistration where Username
LIKE '%' + @Username + '%'
end
end
我正在尝试通过在文本框中键入来搜索项目代码,我想从 SQL 数据库中获取同一行中的特定列。我在 datagridview 中创建了带有 headers 的列,我希望在特定的 datagridview 列中搜索到数据。我写了代码,但它不工作。我不知道该怎么做。我是新手,正在努力学习 vb。请给点建议。
这是我的代码:
Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click
Using cn As New SqlConnection("server= PANKAJ\SQLEXPRESS; database = pankaj billing software; integrated security=true")
Using cmd2 As New SqlCommand("select itemcode As 'Item Code', item,qty As Quantity, weight as Weight from stockdata Where itemcode = @itemcode;", cn)
cmd2.Parameters.AddWithValue("@itemcode", TextBox1.Text)
cn.Open()
Dim dr As SqlDataReader = cmd2.ExecuteReader()
dt.Load(dr)
DataGridView1.DataSource = dt
For Each row As DataGridViewRow In DataGridView1.Rows
cmd2.Parameters.Add("@item", SqlDbType.VarChar)
cmd2.Parameters.Add("@qty", SqlDbType.VarChar)
cmd2.Parameters.Add("@weight", SqlDbType.VarChar)
With cmd2
row.Cells(1).Value = .Parameters("@item").Value
row.Cells(2).Value = .Parameters("@qty").Value
row.Cells(2).Value = .Parameters("@weight").Value
End With
cmd2.ExecuteNonQuery()
Next
End Using
End Using
End Sub
我使用位于 DataGridView 外部的 TextBox 输入要搜索的项目代码。我添加了一个按钮来进行搜索并将数据检索到 DataReader。
DataReader 然后加载声明为表单级别(class 级别变量)的 DataTable。我们希望每次搜索时都使用相同的 DataTable,以便将项目添加到网格中。使用 Load 方法,如果 DataTable 已包含行,则来自数据源的传入数据将与现有行合并。然后将 DataTable 绑定到 DataGridView。每次用户在文本框中输入项目代码并单击搜索按钮时,都会在网格中添加一个新行。
为了使列 header 看起来更漂亮,请在您的 Select 语句中用作别名。数据库列名称后面的 As 子句是别名,将在 DataGridView 中显示为 header。如果您的别名中有 space,则必须用单引号括起来。
Private dt As DataTable
Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
dt = New DataTable()
End Sub
Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
Using cn As New SqlConnection("server= PANKAJ\SQLEXPRESS; database = pankaj billing software; integrated security=true")
Using cmd2 As New SqlCommand("select itemcode As 'Item Code', item,qty As Quantity, weight as Weight from stockdata Where itemcode = @itemcode;", cn)
cmd2.Parameters.AddWithValue("@itemcode", txtItemCode.Text)
cn.Open()
Dim dr As SqlDataReader = cmd2.ExecuteReader()
dt.Load(dr)
DataGridView1.DataSource = dt
End Using
End Using
End Sub
P.S。很高兴看到参数的使用和Using blocks! :-)
这个怎么样?
'"C:\your_path\Northwind.mdb"
Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Windows.Forms
Public Class Form1
Inherits System.Windows.Forms.Form
Private bindingSource1 As New BindingSource()
Private dataAdapter As New OleDbDataAdapter()
<STAThreadAttribute()> _
Public Shared Sub Main()
Application.Run(New Form1())
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\your_path\Northwind.mdb"
Dim selectCommand As String
Dim connection As New OleDbConnection(connectionString)
selectCommand = "Select * From MyExcelTable ORDER BY ID"
Me.dataAdapter = New OleDbDataAdapter(selectCommand, connection)
With DataGridView1
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader
End With
Dim commandBuilder As New OleDbCommandBuilder(Me.dataAdapter)
Dim table As New DataTable()
table.Locale = System.Globalization.CultureInfo.InvariantCulture
Me.dataAdapter.Fill(table)
Me.bindingSource1.DataSource = table
Dim data As New DataSet()
data.Locale = System.Globalization.CultureInfo.InvariantCulture
DataGridView1.DataSource = Me.bindingSource1
Me.DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Aqua
Me.DataGridView1.AutoResizeColumns( _
DataGridViewAutoSizeColumnsMode.AllCells)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, btnUpdate.Click
Dim table As New DataTable()
Me.bindingSource1 = Me.DataGridView1.DataSource
table = Me.bindingSource1.DataSource
Me.dataAdapter.Update(table)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click, btnClose.Click
Me.Close()
End Sub
Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged, TextBox1.Click
Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\your_path\Northwind.mdb"
Dim selectCommand As String
Dim connection As New OleDbConnection(connectionString)
'selectCommand = "Select * From MyExcelTable where Fname = '" & TextBox1.Text & "'"
'"SELECT * FROM Customers WHERE Address LIKE '" & strAddressSearch & "%'"
'or ending with:
'"SELECT * FROM Customers WHERE Address LIKE '%" & strAddressSearch & "'"
selectCommand = "Select * From MyExcelTable where Fname Like '%" & TextBox1.Text & "%'"
Me.dataAdapter = New OleDbDataAdapter(selectCommand, connection)
With DataGridView1
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader
End With
Dim commandBuilder As New OleDbCommandBuilder(Me.dataAdapter)
Dim table As New DataTable()
table.Locale = System.Globalization.CultureInfo.InvariantCulture
Me.dataAdapter.Fill(table)
Me.bindingSource1.DataSource = table
Dim data As New DataSet()
data.Locale = System.Globalization.CultureInfo.InvariantCulture
DataGridView1.DataSource = Me.bindingSource1
Me.DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Aqua
Me.DataGridView1.AutoResizeColumns( _
DataGridViewAutoSizeColumnsMode.AllCells)
End Sub
End Class
我看到了几件事要检查:
- 当您使用数据源时,您不需要遍历 reader. 的行
- 检查连接字符串("pankaj billing software" 真的是数据库的名称吗?他们通常没有空格)
- SQL 语句中的列名称需要方括号(
[]
或双引号"
)而不是单引号('
)。 - 最好避免使用
AddWithValue()
函数,而使用确切的列类型和长度调用Add()
。 - 我们没有看到
dt
在哪里声明。
把它们放在一起(在 name/length 列猜测,还没有更改数据库名称),你会得到这个:
Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click
Dim sql = "select itemcode As [Item Code], item, qty As Quantity, weight as Weight from stockdata Where itemcode = @itemcode;"
Dim dt As New DataTable()
Using cn As New SqlConnection("server=PANKAJ\SQLEXPRESS;database=pankaj billing software;integrated security=true"), _
cmd2 As New SqlCommand(sql, cn)
cmd2.Parameters.Add("@itemcode", SqlDbType.NVarChar, 10).Value = TextBox1.Text
cn.Open()
Using dr As SqlDataReader = cmd2.ExecuteReader()
dt.Load(dr)
End Using
End Using
DataGridView1.DataSource = dt
End Sub
但重要的是 "Not working" 从来没有 足够的关于您的代码的信息。你实际看到了什么与你预期的不同?如果有错误消息,它具体说了什么?
这是我的脚本代码:
protected void search_click(object sender, EventArgs e)
{
SqlConnection sqlCon = new SqlConnection(conn);
if (sqlCon.State == ConnectionState.Closed)
sqlCon.Open();
SqlCommand cmd = new SqlCommand("spSearchUser", sqlCon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@SearchTerm", "username");
cmd.Parameters.AddWithValue("@Username", txtSearch.Text);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
dr.Read();
searchBind();
GridView1.Visible = true;
txtSearch.Text = "";
}
}
这是 WebForm 代码:
<div>
<table>
<tr>
<td>Search</td>
<td>
<asp:TextBox ID="txtSearch" runat="server"></asp:TextBox>
</td>
<td>
<asp:Button ID="btnSearch" runat="server" Text="Go" onclick="search_click" />
</td>
</tr>
</table>
<asp:GridView ID="GridView1" runat="server"></asp:GridView>
</div>
这是我的存储过程:
alter procedure spSearchUser
(
@SearchTerm nvarchar(50),
@Username nvarchar(50)
)
as
begin
set nocount on;
if @SearchTerm = 'username'
begin
select Username,City,Gender,Email from tblRegistration where Username
LIKE '%' + @Username + '%'
end
end