簡體   English   中英

動態 SQL 查詢 VB.net 變量字符串條件

[英]Dynamic SQL Query With VB.net Variables String condition

大家好,可能是一個快速的答案,但我正在努力解決這個問題,認為一定有更好的方法。

如果字符串的條件不是 null 或為空,我有 4 個字符串,我將其添加到查詢中,但第一個始終不需要 AND 所以我添加了 WHERE 1 = 1 然后我可以添加 AND ID = @ID 等所以可以添加所有四個。 我錯過了什么?

   Dim sqlBuilder As New StringBuilder()
    '1 = 1 allows an and.
    sqlBuilder.Append("SELECT * FROM table WHERE 1=1 ")

    If Surname <> "" Then
        sqlBuilder.Append(" AND Surname=@surname")
    End If
    If Payroll <> "" Then
        sqlBuilder.Append(" AND payroll = @payroll")
    End If
    If VehicleReg <> "" Then
        sqlBuilder.Append(" AND registration = @registration")
    End If
    If OrgID > 0 Then
        sqlBuilder.Append(" AND OrganisationID = @orgid")
    End If

有一種簡單的方法可以使用單個不變的 SQL 查詢,同時使參數可選,例如

Dim query = "SELECT * FROM Person WHERE (@FirstName IS NULL OR FirstName = @FirstName) AND (@LastName IS NULL OR LastName = @LastName)"
Dim command As New SqlCommand

command.CommandText = query

With command.Parameters
    .Add("@FirstName", SqlDbType.VarChar, 50).Value = If(firstNameTextBox.TextLength = 0, CObj(DBNull.Value), firstNameTextBox.Text)
    .Add("@LastName", SqlDbType.VarChar, 50).Value = If(lastNameTextBox.TextLength = 0, CObj(DBNull.Value), lastNameTextBox.Text)
End With

通過將參數設置為 NULL 您可以有效地忽略它。 例如,如果@FirstName參數設置為 NULL 則@FirstName IS NULL為真,並且第一組條件匹配每一行,否則它只匹配那些包含指定名字的行。 對於第二組標准也是如此。 您可以對任意多組標准執行相同的操作,將參數與 NULL 或列與參數進行比較。

需要注意的一點是,我在上面的示例中為四個標准使用了兩個參數。 這是可能的,因為SqlClient支持真正的命名參數。 對於不支持真正命名參數的提供程序,例如帶有OleDb的 Jet 或 ACE,您實際上需要添加兩倍的參數,因為您不能在 SQL 代碼中兩次使用相同的參數,例如

Dim query = "SELECT * FROM Person WHERE (@FirstName1 IS NULL OR FirstName = @FirstName2) AND (@LastName1 IS NULL OR LastName = @LastName2)"
Dim command As New OleDbCommand

command.CommandText = query

Dim firstName = If(firstNameTextBox.TextLength = 0, CObj(DBNull.Value), firstNameTextBox.Text)
Dim lastName = If(lastNameTextBox.TextLength = 0, CObj(DBNull.Value), lastNameTextBox.Text)

With command.Parameters
    .Add("@FirstName1", SqlDbType.VarChar, 50).Value = firstName
    .Add("@FirstName2", SqlDbType.VarChar, 50).Value = firstName
    .Add("@LastName1", SqlDbType.VarChar, 50).Value = lastName
    .Add("@LastName2", SqlDbType.VarChar, 50).Value = lastName
End With

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM