更新查询阻止空参数更新列

Update query prevent empty param from update the column

提问人:Ratu Batu Hamlo Koto 提问时间:3/24/2023 最后编辑:Ken WhiteRatu Batu Hamlo Koto 更新时间:3/24/2023 访问量:45

问:

我使用 VB.NET 创建 API。我有 5 个参数。对于更新查询,无需更新所有 5 个参数。它只能是 1、2、3 或 4。我尝试只插入两个参数来运行 API,而其他 4 个我将其留空。

但随后空参数将该列更新为空列。这意味着将 pervious 数据替换为空 String。

我想如何防止这种情况发生?下面是我当前的代码。

            Try
           
            If String.IsNullOrEmpty(id) Or String.IsNullOrEmpty(name) Or String.IsNullOrEmpty(email) Or String.IsNullOrEmpty(role_id) Or String.IsNullOrEmpty(factory_id) Then

                Dim myResponse As New failResponceClass
                myDataAdapter = New MySqlDataAdapter

                myDataAdapter.UpdateCommand = New MySqlCommand("UPDATE wla_user SET name = '" & name & "', email = '" & email & "', role_id = '" & role_id & "', factory_id = '" & factory_id & "' WHERE id = '" & id & "'")

                myDataAdapter.UpdateCommand.Connection = mySQLConnection
                mySQLConnection.Open()
                myDataAdapter.UpdateCommand.ExecuteNonQuery()
                mySQLConnection.Close()

                myResponse.statusCode = 1
                myResponse.errCode = ""
                myResponse.title = l_Title_TGWLAppUser
                myResponse.desc = "TGWL App User"

                Me.Context.Response.ContentType = "application/json; charset=utf-8"
                Me.Context.Response.Write(JsonConvert.SerializeObject(myResponse))
MySQL vb.net

评论

1赞 Hursey 3/24/2023
首先,你没有使用参数。您正在使用不明智的字符串连接方法来构造 sql。关于如何使用命令参数正确构造 SQL 命令,有很多示例。但是,无论哪种方式,使用 If 语句根据参数的值构建条件都应该相对简单。
0赞 jmcilhinney 3/24/2023
为什么要创建数据适配器?数据适配器的全部意义在于保存 中的所有更改,尤其是不同类型的更改。如果你没有调用数据适配器,那么你甚至没有使用它。如果要调用命令,只需创建命令即可。DataTableUpdateExecuteNonQuery

答:

4赞 jmcilhinney 3/24/2023 #1

对于 SQL 代码,字符串连接本身并不是坏事,但连接用户输入的值肯定是坏事。您应该做的是使用参数作为值,但对条件使用串联,以便您可以将任意数量的参数添加到您的 SQL 代码中。下面是一个适用于两列的示例。您可以根据需要将其扩展到任意数量的列:

Public Sub UpdateTable(id As Integer, column1 As String, column2 As String)
    Using connection As New SqlConnection("connection string here"),
          command As New SqlCommand
        Dim criteria As New List(Of String)

        If Not String.IsNullOrWhiteSpace(column1) Then
            criteria.Add("Column1 = @Column1")
            command.Parameters.Add("@Column1", SqlDbType.VarChar, 50).Value = column1
        End If

        If Not String.IsNullOrWhiteSpace(column2) Then
            criteria.Add("Column2 = @Column2")
            command.Parameters.Add("@Column2", SqlDbType.VarChar, 50).Value = column2
        End If

        command.CommandText = $"UPDATE MyTable SET {String.Join(", ", criteria)} WHERE Id = @Id"
        command.Connection = connection
        command.Parameters.Add("@Id", SqlDbType.Int).Value = id

        connection.Open()
        command.ExecuteNonQuery()
    End Using
End Sub