【问题标题】:Searching database using multiple textboxes using vb.net使用 vb.net 使用多个文本框搜索数据库
【发布时间】:2015-03-24 19:56:32
【问题描述】:

我有 6 个文本框和一个搜索按钮... 如果一个文本框已填充或两个、三个文本框已填充,我的搜索按钮应从数据库中搜索行,即使一个文本框已填充或所有 6 个文本框均已填充,总搜索也应有效

【问题讨论】:

  • 听起来不错,你有什么问题?
  • 谢谢大家的回复,

标签: asp.net vb.net


【解决方案1】:

我会推测一下您的问题的意图。你想:

  1. 根据手动输入一个或多个搜索词来搜索 SQL Server 表?
  2. 避免使用 ad-hoc SQL 来防止注入攻击?

如果是这样,我建议使用 SQL-Server 表值函数,它将分隔字符串转换为表变量,该变量可以像查询中的任何其他表一样使用。

这是一个示例函数:

CREATE FUNCTION [dbo].[fnVarcharListToTable](@List varchar(8000), @Delim char(1) = NULL)
RETURNS @TableVar TABLE(ID int identity(1,1), Val varchar(256) collate database_default)
AS
BEGIN
    --note that each element will be trimmed of whitespace

    declare
        @DelimIndex     int

    If (@Delim IS NULL) SET @Delim = ','

    select @List = ltrim(rtrim(@List))

    if (left(@List,1) = @Delim)
        begin
            select @List = ltrim(right(@List,len(@List) - 1))
        end

    if (right(@List,1) = @Delim)
        begin
            select @List = rtrim(left(@List,len(@List) - 1))
        end

    while (CHARINDEX(@Delim, @List, 1) > 0)
    begin
        select @DelimIndex = CHARINDEX(@Delim, @List, 1)
        insert into @TableVar (Val) select left(ltrim(rtrim(left(@List,@DelimIndex-1))), 256)
        select @List = ltrim(right(@List,len(@List) - @DelimIndex))
    end

    if (@List) <> ''
        --get the last item
        begin
            insert into @TableVar (Val) select ltrim(rtrim(@List))
        end

   RETURN
END

对于客户端,假设您有一个包含 6 个文本框的表单,并且您希望从包含文本的文本框中传递值。您可以使用以下机制做到这一点:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim searchterms = String.Join("|", From textbox In {TextBox1, TextBox2, TextBox3, TextBox4, TextBox5, TextBox6} Where textbox.Text <> String.Empty Select textbox.Text)

    If searchterms = String.Empty Then
        MessageBox.Show("No Search Terms Defined")
    End If

    Using cn = New SqlConnection("Server=YourServer;Integrated Security=SSPI;Database=YourDatabase")
        cn.Open()

        Using cmd = New SqlCommand("SELECT * FROM Customer INNER JOIN dbo.fnVarcharListToTable(@searchterms,'|') SearchTerms on SearchTerms.val = Customer.Name", cn)
            cmd.Parameters.AddWithValue("@searchterms", searchterms)

            Using reader = cmd.ExecuteReader()
                While reader.Read
                    MessageBox.Show("Found: " + reader("Name").ToString())
                End While
            End Using
        End Using
    End Using
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2018-06-23
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多