sql-server - 如何在repeater vb.net中基于下拉列表绑定(bind)数据

标签 sql-server vb.net

我有 5 个下拉列表/组合框。是否有更有效的方法使用函数和参数绑定(bind)数据,在某些情况下参数可以为空。而不是为每个场景创建单独的数据绑定(bind)。

我希望用户能够根据一个或多个(组合)下拉列表选择来查看转发器中的数据。例如。用户在 DdlA 和 ComboboxA 中选择值,但希望将其他值留空。

下面是我编写的代码示例,一次仅适用于一项选择。我如何调整它以使用多个但不一定是所有选定的值。

Protected Sub BttnSave_Click(sender As Object, e As EventArgs) Handles BttnSave.Click

       If DdlA.SelectedValue = "1" And DdlB.SelectedValue = "1" And DdlC.SelectedValue = "1" And ComboboxA.SelectedValue = "" And DdlD.Text = "" Then
        Me.ReadAllData()
    ElseIf DdlA.SelectedValue <> "1" And DdlB.SelectedValue = "1" And DdlC.SelectedValue = "1" And ComboboxA.SelectedValue = "" And DdlD.Text = "" Then
        Me.ReadAData()
    ElseIf DdlA.SelectedValue = "1" And DdlB.SelectedValue <> "1" And DdlC.SelectedValue = "1" And ComboboxA.SelectedValue = "" And DdlD.Text = "" Then
        ReadBData()
    ElseIf DdlA.SelectedValue = "1" And DdlB.SelectedValue = "1" And DdlC.SelectedValue <> "1" And ComboboxA.SelectedValue = "" And DdlD.Text = "" Then
        ReadCData()
    ElseIf DdlA.SelectedValue = "1" And DdlB.SelectedValue = "1" And DdlC.SelectedValue = "1" And ComboboxA.SelectedValue <> "" And DdlD.Text = "" Then
        ReadComboboxData()
    ElseIf DdlA.SelectedValue = "1" And DdlB.SelectedValue = "1" And DdlC.SelectedValue = "1" And ComboboxA.SelectedValue = "" And DdlD.Text <> "" Then
        ReadDData()
    End If
 End Sub

  Private Sub ReadAData()
    Dim query As String = "SELECT * FROM Test WHERE A = @A ORDER BY ID DESC"
    Dim cmd As SqlCommand = New SqlCommand(query)
    cmd.Parameters.AddWithValue("@A", DdlA.SelectedItem.Text)
    Using con As SqlConnection = New SqlConnection(GblSqlCon)
        Using sda As SqlDataAdapter = New SqlDataAdapter()
            cmd.Connection = con
            sda.SelectCommand = cmd
            Using dt As DataTable = New DataTable()
                sda.Fill(dt)
                Repeater1.DataSource = dt
                Repeater1.DataBind()
            End Using
        End Using
    End Using
End Sub

  Private Sub ReadBData()
    Dim query As String = "SELECT * FROM [dbo].[TestActivityLog] WHERE B = @B ORDER BY ID DESC"
    Dim cmd As SqlCommand = New SqlCommand(query)
    cmd.Parameters.AddWithValue("@B", DdlB.SelectedItem.Text)
    Using con As SqlConnection = New SqlConnection(GblSqlCon)
        Using sda As SqlDataAdapter = New SqlDataAdapter()
            cmd.Connection = con
            sda.SelectCommand = cmd
            Using dt As DataTable = New DataTable()
                sda.Fill(dt)
                Repeater1.DataSource = dt
                Repeater1.DataBind()
            End Using
        End Using
    End Using
End Sub

最佳答案

已编辑
尝试使用存储过程。
如果我没记错的话,您想要创建类似的内容,如果选择了任何组合框值,那么您的转发器应该加载。

检查以下方法。

  • 在 VB.NET 中

      Private Sub ReadAllData()
    
      'I Used oledbConnection, you can continue using sqlconnection.
      Using xcn As New OleDbConnection
          Using com As New OleDbCommand
              xcn.ConnectionString = "YOUR CONNECTION STRING"
              com.Connection = xcn
              com.CommandType = CommandType.StoredProcedure
              com.CommandText = "YOUR STORED PROCEDURE NAME"
              'try to pass string.empty or "" if your combobox value is null
              com.Parameters.AddWithValue("@A", OleDb.OleDbType.VarChar).Value = IIf(DdlA.SelectedValue = Nothing, "", DdlA.SelectedValue)
              com.Parameters.AddWithValue("@B", OleDb.OleDbType.VarChar).Value = IIf(DdlB.SelectedValue = Nothing, "", DdlB.SelectedValue)
              com.Parameters.AddWithValue("@C", OleDb.OleDbType.VarChar).Value = IIf(DdlC.SelectedValue = Nothing, "", DdlC.SelectedValue)
              com.Parameters.AddWithValue("@D", OleDb.OleDbType.VarChar).Value = IIf(DdlD.SelectedValue = Nothing, "", DdlD.SelectedValue)
              com.Parameters.AddWithValue("@E", OleDb.OleDbType.VarChar).Value = IIf(DdlE.SelectedValue = Nothing, "", DdlE.SelectedValue)
              xcn.Open()
              Using dt As DataTable = New DataTable()
                  sda.Fill(dt)
                  Repeater1.DataSource = dt
                  Repeater1.DataBind()
              End Using
          End Using
      End Using
    End Sub
    

创建 SQL Server 存储过程,

CREATE PROCEDURE [dbo].[YourProcedureName]  @A varchar(MAX), @B varchar(MAX), @C varchar(MAX), 
                                            @D varchar(MAX), @E varchar(MAX)
as
DECLARE @sql as varchar (MAX)
   set @sql = 'Select (All your column names except type1) from 
                (SELECT 1 as type1, * FROM [dbo].[TestActivityLog]) as A
               where A.type1 = 1'
    if @A <> ''
        begin
            set @sql = @sql + ' AND ColumnA IN ('+ @A +')'
        end
    if @B <> ''
        begin
            set @sql = @sql + ' AND ColumnB IN ('+ @B +')'
        end
    if @C <> ''
        begin
            set @sql = @sql + ' AND ColumnC IN ('+ @C +')'
        end
    if @D <> ''
        begin
            set @sql = @sql + ' AND ColumnD IN ('+ @D +')'
        end
    if @E <> ''
        begin
            set @sql = @sql + ' AND ColumnE IN ('+ @E +')'
        end
    set @sql = @sql + ' ORDER BY columnnames'
exec (@sql)

如果您的表 TestActivityLog 中有一个具有固定值的列,那么您可以避免使用 type1 并像这样使用它

   set @sql = 'SELECT * FROM [dbo].[TestActivityLog] where FixedvalueColumn = thatfixedvalue' if... and continue code as above.

希望这对您有帮助。 :)

关于sql-server - 如何在repeater vb.net中基于下拉列表绑定(bind)数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76235784/

相关文章:

sql-server - Powershell Invoke-Sqlcmd在发生错误后从头开始重新启动脚本

sql - 如何将 base-2 字符串(例如 '001011' )转换为二进制数据类型?

vb.net - 如何在 VB.net 中以编程方式填充 DataGridViewComboBoxColumn?

asp.net - DLL 引用 DLL

c++ - dllimport C++ DLL 在 VB.net 中

sql - 如何将音频插入 SQL Server

sql-server - 是否可以在 Debian 上安装 Microsoft SQL Server v.Next?

sql - SQL:没有值而不是 Null

.net - 从图元文件到 JPEG/GIF 的 GDI+ 图像转换结果为黑色背景

vb.net - 对象的深拷贝