vb.net обновить запрос с помощью vb.net

В запросе обновления sql, запущенном в приложении vb.net, я обновляю данные некоторых столбцов до таблицы данных 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. работает медленно, учитывая, что в таблице около 60 тыс. записей
  2. Если бы значение в моем приложении с данными было NULL, то я хочу обновить его как NULL, что будет лучшим способом? я попробовал что-то вроде следующего

If IsDBNull(mainDatatable.Rows(i)("rank")), затем q.Parameters.Add (New SqlParameter ("@ rank", "NULL")), иначе q.Parameters.Add(New SqlParameter("@rank", mainDatatable.Rows(i)("rank"))) End If

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

Писать следующую строку кода q.Parameters.Add(New SqlParameter("@rank", "NULL")) не делает нулевую запись, вместо этого он будет лечить Null как строка
что вы можете попробовать это

q.Parameters.Add(new SqlParameter() { 
        ParameterName="@test",
        IsNullable=true,
        Value=DBNull.Value
    });
Другие вопросы по тегам