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 проблемы
- работает медленно, учитывая, что в таблице около 60 тыс. записей
- Если бы значение в моем приложении с данными было 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
});