2

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

请看下面:

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

4 回答 4

5

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

无论如何,这种使用 ADO 技术的编程风格已经相当老了,从 DAO 到 ADO 的人们经常会打开一个游标来以这种方式遍历数据库......它不遵循关于如何做事的现代最佳实践,你可以并且应该用插入语句替换它!

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

实际上,大约 12 年前,我曾经非常像那样编写代码:p 主要是因为我只是不知道更好,不管使用的技术如何。

于 2012-01-10T19:55:05.877 回答
2

啊,好古老的经典 ASP ;)

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

我以前见过这样做,但我自己从来没有这样做过。正如其他人所说,一个简单的参数化 INSERT 语句会更好,IMO。

于 2012-01-10T20:01:06.280 回答
1

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

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

于 2012-01-10T19:56:40.180 回答
1

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

于 2012-01-10T19:57:21.067 回答