Понимание классического ASP

Я просматриваю какой-то старый код и нашел кусок, смысл которого я не могу понять... Насколько я могу судить, это просто простая вставка. но почему они сделали это таким образом? можно ли переписать во вставку, или я могу что-то сломать?

см. ниже:

Set TextRS = Server.CreateObject("ADODB.RecordSet")
 Set TextRS.ActiveConnection = Conn
 TextRS.Source = "SELECT IDX,TIMESTAMP,CURRENTFLAG,TEXT FROM " & TextTable & " WHERE 1=2 FOR UPDATE"
 TextRS.CursorLocation = 2
 TextRS.CursorType = 3
 TextRS.Open ,,,3

 TextRS.AddNew
 TextRS(0).Value = IDX
 TextRS(1).Value = Timestamp
 TextRS(2).Value = "Y"
  TextRS(3).AppendChunk TextPiece
 TextRS.Update

 TextRS.Close

person Madam Zu Zu    schedule 10.01.2012    source источник
comment
Это один из способов параметризовать оператор вставки и избежать SQL-инъекций. Если вы измените это на оператор вставки, убедитесь, что вы параметризовали запрос.   -  person John Hartsock    schedule 10.01.2012


Ответы (4)


Эта часть исходника меня немного смутила.... where 1 = 2??? Видимо, это имело целью обеспечить отсутствие совпадений.

В любом случае, этот стиль программирования довольно устарел с использованием технологии ADO, и люди, переходящие из DAO в ADO, часто открывали курсор для перебора базы данных таким образом... он не соответствует современным передовым методам работы, вы можете и следует заменить его оператором вставки!

Возможно, он был написан до версии jet4.0/access 2000, и в этом случае это была попытка смоделировать параметризованную хранимую процедуру. Хотя, если система вообще более современная, я бы настоятельно рекомендовал использовать хранимую процедуру, поскольку она имеет множество преимуществ. Кэшированные планы выполнения, параметры для снижения вероятности SQL-инъекций

На самом деле я писал очень похожий код 12 лет назад или около того :p В основном потому, что я просто не знал лучше, независимо от используемой технологии.

person Jordan    schedule 10.01.2012
comment
Этот код предназначен для того, чтобы убедиться, что результаты не возвращаются, когда весь код предназначен для вставки записи. - person Andrew Barber; 11.01.2012
comment
+1 за ответ, который действительно определил, откуда взялся этот стиль кодирования БД. - person AnthonyWJones; 11.01.2012
comment
-1: Я думаю, вы должны отдать должное оригинальному программисту. Во-первых, итерация не выполняется, и 1 = 2 не бесполезен; он используется для извлечения пустого набора записей, содержащего определение схемы — на самом деле хороший прием. Это было сделано как простой способ смоделировать параметризованный запрос и, таким образом, избежать SQL-инъекций. Вы предлагаете переписать как INSERT, но не предлагаете использовать параметризованный запрос, тем самым сводя на нет одно из самых важных преимуществ используемой техники. - person D'Arcy Rittich; 11.01.2012
comment
Я не мог отдать должное первоначальным программистам, если не знал, что это за система. Возможно, если бы это был JET & ДО Jet 4.0/Access 2000, я был бы более снисходительным, поскольку у них не было хранимых процедур. Во всяком случае, это был просто плохой способ сделать это по сравнению с созданием SP [что в любом случае предотвратило бы SQL-инъекцию, с кэшированными планами выполнения и т. д.]. Единственное преимущество, которое я вижу, это обработка его как курсор на стороне клиента, следовательно, точка итерации . Моя точка зрения заключалась в том, что стилистически они думали именно так, это действительно было преимуществом сомнения. Я думаю, что -1 неуместен, но это ваш голос;) - person Jordan; 11.01.2012
comment
Ваш комментарий содержит гораздо лучшие рассуждения, чем ваш ответ, в котором в основном говорилось о бесполезности, старости и плохости без особых оговорок. Однако остерегайтесь рекламировать хранимые процедуры как лекарство от SQL-инъекций. Это не обязательно правда. Я видел много SP, подверженных SQL-инъекциям. - person D'Arcy Rittich; 11.01.2012
comment
Вам нужно будет отредактировать свой ответ, чтобы я изменил свой голос. Возможно, перемещение ваших комментариев туда было бы полезно. - person D'Arcy Rittich; 11.01.2012
comment
Просто потому, что вы не знаете, что что-то делает, не называйте это бесполезным. Это означает, что объект набора записей возвращается без записей, но с допустимой схемой, после чего вы можете просто выполнить .AddNew, и вы защищены от SQL-инъекций без необходимости выполнять параметризованный запрос, что намного сложнее в классическом ASP. - person Richard Benson; 11.01.2012
comment
@RedFilter хорошо, я отредактирую это прямо сейчас, так как ваша точка зрения понятна. Хотя, честно говоря, я в основном согласен с вашим несогласием с бесполезностью. Это УСТАРЕЛО, и я имел в виду плохое в том смысле, что сегодня оно не так полезно, но достаточно справедливо! - person Jordan; 11.01.2012

Ах, старый добрый классический ASP;)

1 = 2 заставляет sql никогда не возвращать совпадение. По сути, это способ создания команды (?), чтобы вы могли «удобно» изменить значения, а затем обновление сохранит их.

Я видел, как это делается раньше, но сам никогда так не делал. Как уже говорили другие, простой пареметизированный оператор INSERT будет лучше, IMO.

person Matt Roberts    schedule 10.01.2012

Я бы переписал это, используя параметризованный запрос ADO. Используемый метод имеет ненужный SELECT, что делает INSERT медленнее.

Этот код кажется немного непонятным, но все, что они делают, — это создают пустой экземпляр строки набора записей, чтобы можно было установить значения и повторно сохранить набор записей. Это должно быть намного медленнее, чем выполнение прямой INSERT.

person D'Arcy Rittich    schedule 10.01.2012

Я бы использовал оператор вставки. Вышеупомянутый код кажется немного "ленивым"... как в "пусть ADO сделает всю работу за меня". Однако на самом деле в этом нет ничего плохого. Часть where 1=2 должна была вернуть "пустую таблицу"... гм... я имею в виду набор записей.

person Kris Krause    schedule 10.01.2012