【问题标题】:Executing update query inside loop在循环内执行更新查询
【发布时间】:2013-12-22 11:16:09
【问题描述】:
   cmd = New SqlCommand("select enrollment,total_fee,discount,net_fee from stu_dtl", openConnection())
        '  dr = cmd.ExecuteReader
        adpt = New SqlDataAdapter(cmd)
        adpt.Fill(ds, "stu_dtl")
        dt = ds.Tables("stu_dtl")
 For i = 0 To dt.Rows.Count - 1
              cmd = New SqlCommand("update stu_dtl set net_fee = '" & (Val(dt.Rows(i).Item("total_fee")) - Val(dt.Rows(i).Item("discount"))) & "' where enrollment = '" & dt.Rows(i).Item("enrollment") & "'", openConnection())
            cmd.ExecuteNonQuery()
        Next

当我对超过 150 条记录执行此代码时,“什么都没有发生”......我做错了什么?还有其他方法可以更新吗??

【问题讨论】:

  • 除非我遗漏了什么,否则您不需要任何代码。只需创建 SQL 更新查询并执行 ExecuteNonQuery 即可完成相同的操作

标签: sql sql-server vb.net tsql


【解决方案1】:

我不确定你做错了什么。但试试这段代码。如果发生错误,它确保数据库回滚。请注意,我假设net_feeenrollment 列的数据类型是Integer

Using connection As SqlConnection = New SqlConnection("TODO: Set connection string.")

    Dim table As DataTable = New DataTable("stu_dtl")
    Dim [error] As Exception = Nothing

    Using command As SqlCommand = connection.CreateCommand()
        command.CommandText = "SELECT [enrollment], [total_fee], [discount], [net_fee] FROM [stu_dtl];"
        Using adapter As New SqlDataAdapter(command)
            adapter.Fill(table)
        End Using
    End Using

    Using transaction As SqlTransaction = connection.BeginTransaction()
        Try

            Dim net_fee As Integer = 0
            Dim enrollment As Integer = 0

            For Each row As DataRow In table.Rows

                net_fee = (CInt(row.Item("total_fee")) - CInt(row.Item("discount")))
                enrollment = CInt(row.Item("enrollment"))

                Using command As SqlCommand = connection.CreateCommand()
                    command.CommandText = "UPDATE [stu_dtl] SET [net_fee] = @net_fee WHERE [enrollment] = @enrollment;"
                    command.Parameters.AddWithValue("@net_fee", net_fee)
                    command.Parameters.AddWithValue("@enrollment", enrollment)
                    command.ExecuteNonQuery()
                End Using

            Next

            transaction.Commit()

        Catch ex As Exception
            [error] = ex
            transaction.Rollback()
        End Try
    End Using

    If (Not table Is Nothing) Then
        table.Dispose()
        table = Nothing
    End If

    If (Not [error] Is Nothing) Then
        Throw [error]
    End If

End Using

编辑

想一想,您可能希望将net_fee 列更改为computed column。公式就是([total_fee] - [discount])

【讨论】:

  • 计算列当然是更好的选择......仍然无法弄清楚为什么查询不起作用。无论如何感谢您的帮助
猜你喜欢
  • 2013-01-16
  • 1970-01-01
  • 2019-06-02
  • 2013-01-04
  • 2011-07-21
  • 2020-05-19
  • 2016-06-29
  • 2013-05-13
  • 1970-01-01
相关资源
最近更新 更多