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. 私のデータ テーブル アプリケーションの値が 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 エントリは作成されず、代わりにNull文字列として扱われます。
あなたが試すことができるのはこれです。

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