2014-12-16 1 views
0

у меня есть 2 разные обновления запроса, в 1 я создал:объяснить различия между двумя разными обновлениями

UPDATE_QUERY = "" 
UPDATE_QUERY = UPDATE_QUERY & "UPDATE ORGBHVTasklist " 
UPDATE_QUERY = UPDATE_QUERY & "SET TaskID = NULL " 
UPDATE_QUERY = UPDATE_QUERY & "WHERE TaskID = ? " 

set cmd = server.CreateObject("ADODB.Command") 
cmd.ActiveConnection = objCon 
cmd.CommandText = UPDATE_QUERY 

set paramID = cmd.CreateParameter("@id", 3, 1, , taskID) 

cmd.Parameters.Append paramID 

cmd.execute 

мой коллега предпочел это:

UPDATE_QUERY = "" 
UPDATE_QUERY = UPDATE_QUERY & "SELECT taskid " 
UPDATE_QUERY = UPDATE_QUERY & "FROM ORGBHVTasklist " 
UPDATE_QUERY = UPDATE_QUERY & "Where taskID = "&taskID&" " 

set objUpdate = Server.CreateObject("ADODB.Recordset") 
objUpdate.CursorType = 2 
objUpdate.LockType = 3 
objUpdate.Open UPDATE_QUERY, objCon 

objUpdate.Fields("taskid") = NULL 
objUpdate.Update 

objUpdate.close 
Set objUpdate = nothing 

Он не может объяснить, которым нужно быть лучше и я тоже не могу. Единственное различие, которое у меня есть, заключается в том, что обновление во втором запросе сбой при отсутствии результатов для обновления.

Может ли кто-нибудь объяснить, в чем разница?

ответ

2

Подводя итог:

Первый подход (параметризованных запросов/подготовленный оператор) является best, потому что

  1. легко: срабатывает само цитирование и форматирование параметров
  2. может быть больше эффективный: СУБД может оптимизировать
  3. избегает выборки и хранения результатов (@Ansgar)
  4. весы лучше: работали бы для многих reco выстр без изменения
  5. защищает от SQL-инъекций

Второй подход хуже, потому что, не имея возможности 1 - 5 и хуже/наивных, потому что не проверяя для пустого набора записей (@peter, @Cageman).

+0

Спасибо, что сделал это намного яснее – Cageman

0

Разница в том, что SQL-код среды vbscript отправляет в БД. В первом запросе SQL ясен, вы делаете простой UPDATE. Во втором запросе вам нужно узнать точный код SQL, посланный из vbscript в БД, возможно, запустив трассировку, настроив некоторую регистрацию более низкого уровня или что-то подобное. Я предполагаю, что второй запрос является циклическим, а в цикле - UPDATE для каждого заданного идентификатора, но не проверяет, не установлен ли набор записей (и поэтому он не работает).