简体   繁体   English

vb.net使用vb.net更新查询

[英]vb.net update query with vb.net

in an sql updatate query runnging in a vb.net application i am updating the data of some columns to the sql datatable, here is the code 在vb.net应用程序中运行的sql updatate查询中,我正在将某些列的数据更新到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

i am having 2 problems 我有2个问题

  1. its running slow considering that the table has about 60k records 考虑到该表具有约60k记录,其运行速度很慢
  2. if the a value in my datatable application was NULL then i want to update it as NULL, what would be the best way? 如果我的数据表应用程序中的a值为NULL,那么我想将其更新为NULL,最好的方法是什么? i tried something like the following 我尝试了以下内容

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 如果IsDBNull(mainDatatable.Rows(i)(“ rank”))然后q.Parameters.Add(New SqlParameter(“ @ rank”,“ NULL”))其他q.Parameters.Add(New SqlParameter(“ @ rank”, mainDatatable.Rows(i)(“ rank”)))如果结束

To respond to (1) the speed question... 为了回答(1)速度问题...

if you do indeed have 60K+ changes to process you don't need to execute 60K update statements. 如果确实要处理60K多个更改,则无需执行60K更新语句。 I would upload the 60K records to a temp table and invoke a stored procedure to do an UPDATE FROM...INNER JOIN statement between the real table and the temp table. 我将60K记录上载到临时表,并调用存储过程以在实际表和临时表之间执行UPDATE FROM ... INNER JOIN语句。 Another possible idea if you don't want to rewrite what you've got is to filter out any rows in your datatable that have not been tainted. 如果您不想重写已有的内容,则另一个可能的想法是过滤掉数据表中未被污染的任何行。 If there is no change then there is no reason to send those update statements... 如果没有更改,则没有理由发送这些更新语句。

Regarding (2) here is syntax... 关于(2)这是语法...

this should work for you regarding sending NULL values as SqlParameters. 对于将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

writing following line of code q.Parameters.Add(New SqlParameter("@rank", "NULL")) doesn't make null entry instead it will treat Null as string. 编写以下代码行q.Parameters.Add(New SqlParameter("@rank", "NULL"))不会输入null,而是将Null视为字符串。
what you can try is this. 您可以尝试的是这个。

q.Parameters.Add(new SqlParameter() { 
        ParameterName="@test",
        IsNullable=true,
        Value=DBNull.Value
    });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM