0

在 vb.net 应用程序中运行的 sql 更新查询中,我将某些列的数据更新到 sql 数据表,这是代码

dim cnn = New SqlConnection(connetionString)
Dim q As New SqlCommand("UPDATE products SET rank=@rank,rankchange=@rankchange,PD=@PD,PDP=@PDP,TPD=@TPD where catalogid=@catalogid",cnn)
cnn.Open()
For i = 0 To mainDatatable.Rows.Count - 1
 q.Parameters.Add(New SqlParameter("@rank", mainDatatable.Rows(i)("rank")))
 q.Parameters.Add(New SqlParameter("@rankchange", mainDatatable.Rows(i)("rankchange")))
 q.Parameters.Add(New SqlParameter("@PD", mainDatatable.Rows(i)("PD")))
 q.Parameters.Add(New SqlParameter("@PDP", mainDatatable.Rows(i)("PDP")))
 q.Parameters.Add(New SqlParameter("@TPD", mainDatatable.Rows(i)("TPD")))
 q.ExecuteNonQuery()
 q.Parameters.Clear()
Next

我有 2 个问题

  1. 考虑到该表有大约 60k 条记录,它的运行速度很慢
  2. 如果我的数据表应用程序中的 a 值为 NULL,那么我想将其更新为 NULL,最好的方法是什么?我尝试了类似以下的方法

If IsDBNull(mainDatatable.Rows(i)("rank")) Then q.Parameters.Add(New SqlParameter("@rank", "NULL")) Else q.Parameters.Add(New SqlParameter("@rank", mainDatatable.Rows(i)("rank"))) End If

4

2 回答 2

2

回答 (1) 速度问题...

如果您确实有 60K+ 更改要处理,则不需要执行 60K 更新语句。我会将 60K 记录上传到临时表并调用存储过程在真实表和临时表之间执行 UPDATE FROM...INNER JOIN 语句。如果您不想重写已有的内容,另一个可能的想法是过滤掉数据表中没有被污染的任何行。如果没有变化,那么就没有理由发送这些更新声明......

关于(2)这里是语法......

这应该适用于您将 NULL 值作为 SqlParameters 发送。

If mainDatatable.Rows(i)("rank") = DBNull.Value Then
  q.Parameters.Add(New SqlParameter("@rankchange", SqlDbType.Int, 4) With { .Value = DBNull.Value })
Else
  q.Parameters.Add(New SqlParameter("@rankchange", SqlDbType.Int, 4) With { .Value = mainDatatable.Rows(i)("rank") })
End If
于 2013-01-21T13:33:02.450 回答
1

编写以下代码行q.Parameters.Add(New SqlParameter("@rank", "NULL"))不会产生空条目,而是将其Null视为字符串。
你可以尝试的是这个。

q.Parameters.Add(new SqlParameter() { 
        ParameterName="@test",
        IsNullable=true,
        Value=DBNull.Value
    });
于 2013-01-21T13:32:33.510 回答