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

其參數化插入語句並避免SQL注入的一種方法。如果您確實將其更改爲插入語句,請確保參數化查詢。 – 2012-01-10 19:55:16

回答

5

源的這部分混淆我有點.... where 1 = 2 ???顯然它有一個確保不匹配的目的。

無論如何,使用ADO技術這種編程風格相當古老,而從DAO到ADO的人往往會打開一個遊標以這種方式遍歷數據庫......它不遵循關於如何做事的現代最佳實踐,你可以並且應該用insert語句替換它!

它可能被寫入pre jet4.0/access 2000,在這種情況下,它試圖模擬參數化的存儲過程。雖然如果系統比現在更加現代化,我會強烈建議使用存儲過程,因爲它具有多種優點。緩存的執行計劃,參數,以減少SQL注入的機會

我實際上習慣編寫類似於12年前左右的代碼:p主要是因爲我只是不知道更好,無論使用哪種技術。

+1

那裏的代碼確保沒有結果返回,當所有的代碼是插入一條記錄。 – 2012-01-10 20:09:21

+0

對於真正發現這種DB編碼風格來自哪裏的答案+1。 – AnthonyWJones 2012-01-10 20:12:00

+1

-1:我認爲你應該給原程序員一些功勞。一方面,沒有迭代完成,'1 = 2'不是無用的;它用於檢索包含模式定義的空記錄集 - 實際上是一個很好的技巧。這是一種簡單的方法來模擬參數化查詢,從而避免SQL注入。您建議重寫爲INSERT,但不建議使用參數化查詢,從而否定所用技術的最重要優點之一。 – RedFilter 2012-01-10 22:45:49

1

我會重寫這個使用參數化的ADO查詢。正在使用的方法有一個不必要的SELECT,這會使INSERT變慢。

該代碼似乎有點模糊,但他們所做的只是創建記錄集行的空實例,以便設置值並重新記錄記錄集。這肯定比直接插入要慢得多。

1

我會利用插入語句。上面提到的代碼看起來有點「懶惰」......就像「讓ADO爲我做工作」一樣。但是,它沒有什麼錯。 where 1=2部分在那裏返回一個「空表」......嗯......我的意思是記錄集。

2

啊,歷久彌新的經典ASP)

1 = 2強制SQL永不返回匹配。這基本上是構建命令(?)的一種方式,以便您可以「方便」更改值,然後更新將存儲它。

我以前見過它,但我從來沒有這樣做過。正如其他人所說,一個簡單的完整的INSERT語句將會更好,IMO。