【问题标题】:Bulk Data update in a windows application using SQL update procedure使用 SQL 更新过程在 Windows 应用程序中批量更新数据
【发布时间】:2020-01-06 13:56:07
【问题描述】:

我创建了一个 Windows 应用程序来将 SQL 数据库中的数据显示到 Windows 应用程序中的 gridview 中。我使用 VB.net 和 SQL 服务器来做到这一点。在 sql 查询中使用 where 条件时,我得到了满足给定数据的值。现在我需要更新显示的数据。为此,我使用了 sql 查询 Update columnName = value where(条件)。列名和值是使用文本框从用户那里获得的。当我在 Sql 中使用查询时,它工作正常并且值在数据库中得到更新。但是,当我在 VB 代码中运行相同的代码时,它不会在 Windows 应用程序中得到更新。我不明白,它的分配时间超出了我的观看时间。请帮我一个人。先谢谢了。这里附上代码。

\代码从这里开始\

Private Sub Btn_Edit_Click(sender As Object, e As EventArgs) Handles btn_Update.Click
        cmdupdate.Connection = connection
        connection.Open()
        'table.Rows.Clear()
        'table.Columns.Clear()

 cmdupdate.CommandText = "update tblWebaccessErrorTrack set @columnName = @editData where IssueDateTime between @frmdate and @todate and ErrorDetails like '%' + @errorDetails + '%' and  ClientIpaddress like '%'+ @IpAddress + '%' and ResponseStatus like '%'+ @responseStatus + '%' and TicketNo like '%' + @ticketNo + '%' select * from tblWebaccessErrorTrack"
        table.Clear()
        '"UPDATE tblWebaccessErrorTrack
        ' SET
        ' @columnName = @editData"
        '"sp_Updatedata"
        'Update tblWebaccessErrorTrack set TicketNo=202010 select * from tblWebaccessErrorTrack

        'cmdupdate.CommandType = CommandType.StoredProcedure
        cmdupdate.Parameters.Add("@frmdate", SqlDbType.DateTime).Value = frm_DateTimePicker.Text
        cmdupdate.Parameters.Add("@todate", SqlDbType.DateTime).Value = to_DateTimePicker.Text
        cmdupdate.Parameters.Add("@errorDetails", SqlDbType.NVarChar).Value = txtErrorDetails.Text
        cmdupdate.Parameters.Add("@IpAddress", SqlDbType.NVarChar).Value = txtClientIp.Text
        cmdupdate.Parameters.Add("@responseStatus", SqlDbType.NVarChar).Value = txtResponseStatus.Text
        cmdupdate.Parameters.Add("@ticketNo", SqlDbType.NVarChar).Value = txtTicketNo.Text
        cmdupdate.Parameters.Add("@columnName", SqlDbType.NVarChar).Value = Columnvalue '//column name
        cmdupdate.Parameters.Add("@editData", SqlDbType.NVarChar).Value = txtEditdata.Text '//Data we give

        adapter = New SqlDataAdapter(cmdupdate)

        adapter.Fill(table)
        adapter.Update(table)
        DataGridView1.DataSource = table
        'adapter.Fill(table)
        'table.Clear()


        'cmdupdate.CommandText = "select * from tblWebaccessErrorTrack" 'where IssueDateTime between @frmdate and @todate and ErrorDetails like '%' + @errorDetails + '%' and  ClientIpaddress like '%'+ @IpAddress + '%' and ResponseStatus like '%'+ @responseStatus + '%' and TicketNo like '%' + @ticketNo + '%'"
        'adapter = New SqlDataAdapter(cmdupdate)
        'adapter.Fill(table)
        'adapter.Update(table)
        'DataGridView1.DataSource = table
        ''adapter.Fill(table)
        ''cmdupdate.Parameters.Clear()
        'table.Clear()
        connection.Close()
        cmd.Parameters.Clear()

    End Sub`enter code here`
  • 出现在某行前面的字符 (') 表示注释行。

【问题讨论】:

  • 您不能使用参数作为列名。 Can I pass column name as input parameter in SQL stored Procedure 有有用的建议。
  • 这不是一个存储过程,所以 Andrew 是不正确的。仅当数据在数据库中时,更新才会起作用。您需要对新行使用 Insert。
  • @jdweng SP 与否,您不能使用参数作为列名(问题中的set @columnName = @editData)。 SP 方面是偶然的。
  • 为什么不呢?这是接受列名的 SQL Server。
  • @jdweng 列名不能是参数。它在文档中:UPDATE (Transact-SQL)SET column_name = expression 不允许 column_name 是表达式;表达式包含一个参数。

标签: sql-server vb.net winforms


【解决方案1】:

如果将代码分成更小的部分,每个部分都做一件事,那就更容易了。它使理解和更新代码更简单。因此,更新列和显示 DGV 的方法将是分开的。

对于 SQL,请注意,只使用一个可重复使用的 SQL 连接是个坏主意。有一种称为connection pooling 的内置机制使运行查询的正确方法变得简单:创建连接、使用连接、处理连接。

如果你想为列名使用一个变量,那么你必须将它连接到 SQL 查询中。这对 SQL 注入是开放的,因此有必要在对其进行任何操作之前验证是否使用了有效的列名。

对于 DateTimePickers,要使用的值是 .Value,而不是 .Text,否则可能会因不同的 Windows 设置/区域设置而出现问题。

所以,这段代码是让它工作的起点:

Private Function IsValidColumnName(colName As String) As Boolean
    'TODO: Put the valid column names in the array.
    Dim validColumnNames = {"Col1", "Col2", "ColWhatever"}
    Return validColumnNames.Any(Function(c) colName = c)

End Function

Private Sub UpdateDataInColumn(columnName As String, newData As String)
    If Not IsValidColumnName(columnName) Then
        Throw New Exception("Invalid column name [" & columnName & "]")
    End If

    Dim sql = "UPDATE tblWebaccessErrorTrack SET [" & columnName & "] & = @editData WHERE IssueDateTime BETWEEN @frmdate AND @todate AND ErrorDetails LIKE @errorDetails AND ClientIpaddress LIKE @IpAddress AND ResponseStatus LIKE @responseStatus AND TicketNo LIKE @ticketNo"

    Using conn As New SqlConnection("Your connection string"),
            cmdupdate As New SqlCommand(sql, conn)

        cmdupdate.Parameters.Add("@frmdate", SqlDbType.DateTime).Value = frm_DateTimePicker.Value
        cmdupdate.Parameters.Add("@todate", SqlDbType.DateTime).Value = to_DateTimePicker.Value
        cmdupdate.Parameters.Add("@errorDetails", SqlDbType.NVarChar).Value = "%" + txtErrorDetails.Text & "%"
        cmdupdate.Parameters.Add("@IpAddress", SqlDbType.NVarChar).Value = "%" + txtClientIp.Text & "%"
        cmdupdate.Parameters.Add("@responseStatus", SqlDbType.NVarChar).Value = "%" + txtResponseStatus.Text & "%"
        cmdupdate.Parameters.Add("@ticketNo", SqlDbType.NVarChar).Value = "%" + txtTicketNo.Text & "%"
        cmdupdate.Parameters.Add("@editData", SqlDbType.NVarChar).Value = newData '//Data we give

        Dim nChanged = cmdupdate.ExecuteNonQuery()

        If nChanged > 1 Then
            ' More than one row was updated. This is probably a Big Problem.
        End If

    End Using

End Sub

Private Sub ShowDataGridView()
    'TODO: write the ShowDataGridView() sub.
End Sub

Private Sub btn_Update_Click(sender As Object, e As EventArgs) Handles btn_Update.Click
    Dim colName = "Some method to select a column would go here."
    Dim newData = txtEditdata.Text

    UpdateDataInColumn(colName, newData)
    ShowDataGridView()

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2023-01-14
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多