了解经典ASP

时间:2012-01-10 19:50:33

标签: sql-server sql-server-2008 asp-classic adodb cursor-position

我正在查看一些旧代码并发现了一件我似乎无法理解其中的内容......就我所知,它只是一个简单的插入。但为什么他们这样做呢?是否可以重写为插入内容,还是可能会破坏某些内容?

请参阅以下内容:

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

4 个答案:

答案 0 :(得分:5)

这部分消息来源让我有点困惑.... where 1 = 2 ??? 显然,它的目的是确保不匹配。

无论如何这种编程风格使用ADO技术相当陈旧,从DAO到ADO的人经常打开游标以这种方式迭代数据库...它没有遵循现代最佳实践,如何做事,你可以而且应该用insert语句替换它!

它可能是在jet4.0 / access 2000之前编写的,在这种情况下,它是试图模拟参数化存储过程。虽然如果系统比那更现代,我强烈建议使用存储过程,因为它有多种好处。缓存执行计划,参数以减少SQL注入的可能性

我实际上习惯于编写非常类似于12年前的代码:p主要是因为我不知道更好,无论使用何种技术。

答案 1 :(得分:2)

啊,好老的经典ASP;)

1 = 2强制sql永远不会返回匹配项。它基本上是一种构建命令(?)的方法,以便您可以“方便地”更改值,然后更新将存储它。

我之前见过它,但从来没有这样做过。正如其他人所说的那样,一个简单的paremetised INSERT语句会更好,IMO。

答案 2 :(得分:1)

我会使用参数化ADO查询重写它。使用的方法有一个不必要的SELECT,这会使INSERT变慢。

该代码似乎有点模糊,但他们所做的只是创建一个记录集行的空实例,以便可以设置值并重新保存记录集。这肯定比直接INSERT慢得多。

答案 3 :(得分:1)

我会使用insert语句。上面提到的代码似乎有点“懒惰”......就像“让ADO为我做的工作”。但是,它并没有什么不妥。 where 1=2部分在那里返回一个“空表”......嗯......我的意思是记录集。