2

Я просматриваю какой-то старый код и обнаружил, что я не могу понять, насколько я понимаю ... Насколько я могу судить, это просто простая вставка. но почему они это сделали? было бы хорошо переписать в вставку или я мог бы что-то сломать?Понимание классического 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 
+0

Его единственный способ параметризовать инструкцию insert и избежать SQL Injection. Если вы измените это на инструкцию insert, убедитесь, что вы параметризируете запрос. –

ответ

5

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

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

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

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

+1

Этот код должен гарантировать, что результаты не будут возвращены, когда весь код предназначен для вставки записи. –

+0

+1 для ответа, который действительно заметил, откуда этот стиль кодирования БД. – AnthonyWJones

+1

-1: Я думаю, вы должны дать оригинальному программисту некоторый кредит. Во-первых, нет итерации, и «1 = 2» не бесполезен; он используется для извлечения пустого набора записей, который содержит определение схемы - на самом деле хороший трюк. Это было сделано как простой способ имитации параметризованного запроса и, таким образом, избежать SQL-инъекции. Вы предлагаете переписывать как INSERT, но не предлагаете использовать параметризованный запрос, тем самым отрицая одно из самых важных преимуществ используемой техники. – RedFilter

1

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

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

1

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

2

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

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

Я видел это раньше, но так и не сделал этого. Как говорили другие, простое заявленное заявление INSERT будет лучше, ИМО.