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。