rs.open sql,conn 与conn.execute(sql)的区别
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
rs.open sql,conn 与conn.execute(sql)的区别 收藏 引用“srnld(天涯)”的话: 什么时候用什么? 那就凭个人经验积累的感觉了: 如果只需要一笔带过的碰碰数据库,用execute 如果要对数据库作比较庞杂的操作!则最好用 rs.open ------------------------------------------------------------------------ rs.open sql,conn:如果sql是delete,update,insert则会返回一个关闭的记录集,在使用过程中不要来个rs.close在文件最后再写rs.close中间可以来多个记录集rs1.open sql1,conn,最后一块关闭记录集:rs.close rs1.close conn.execute(sql):如果sql是update,insert,delete则应该使用conn.execute(sql)也可以不要括号conn.execute sql 如果sql是select语句则应该使用set rs=conn.execute(sql)括号一定要,不能省略:这是因为vb的特性,带返回值的调用必须加括号,不带返回值的调用可以不要括号。 1.conn.execute sql="select * from admin where username='xiaozhu'" set rs=conn.execute(sql) '执行完以后自动关闭记录集 '最后只需要关闭连接就可以了 conn.close set conn=nothing 2.rs.open set rs=server.createobject("adodb.recordset") sql="select * from admin where username='xiaozhu'" rs.open sql,conn,1,1 '可以自己设定一些参数,即锁定和游标的移动方式 '最后要关闭记录集和连接 rs.close set rs=nothing conn.close set conn=nothing 3.command.execute sql="select * from admin where username='xiaozhu'" set rs=command.execute(sql) 1. set rs=conn.execute("如果是select语句") 得到的rs.recordcount=-1 rs.open sql,conn("sql为select语句") 得到的rs.recordcount为正常的记录数 2. rs.open是打开数据库 conn.execute 是执行SQL指令 set rs=conn.execute(insert,update,delete)返回一个关闭了的记录集 set rs=conn.execute(select)返回一个没有关闭的记录集 3. CONN.EXECUTE(SQL,RowsAffected,C) 参数含义: SQL的值可以是SQL语句、表名、存储过程名,也可以是数据提供者所能接受的任意字符串。为了提高性能,最好为C参数指定合适的值 可选参数RowsAffected将返回INSERT、UPDATE或DELETE查询执行以后所影响的数目。这些查询会返回一个关闭的Recordset对象。 一个SELECT查询将返回RowsAffected值为-1并且返回带有一行或多行内容的打开的Recordset。 4. conn.execute sql适合于不需返回recordset对象时使用,比如下面的代码: sql="delete from enews where id="&cstr(id) conn.execute sql 如果需要返回recordset对象,则使用如下代码: sql="select from enews where id="&cstr(id) set rs = conn.execute(sql) 如果去掉execute(sql)这儿的括号(即为set rs = conn.execute sql),就会提示“语句未结束”这样的错误提示,我翻看了一下语法格式,发现有二种格式,详解如下: 格式一:Connection对象名.Execute(SQL指令). 格式二:Connection对象名.Execute(数据表名)。 附: set rs = conn.execute(sql) 是带有返回值的,一般sql为查询的时候使用。如 set rs = conn.execute("select * from ...") 当然执行insert into 和delete也是可以的 set rs = conn.execute("insert into table (f1,f2..") 但是要创建Recordset对象,占用服务器资源。在insert into, delete的时候我们一般不需要返回记录集。所以我是这样认为的: 在使用查询的时候,用 set rs = conn.execute("select * from table") 在插入和删除时候,用 conn.execute("delete from table where ...") 第二种方式代码简洁,不需要显式地创建Recordset对象(但实际上好象是隐式创建的) 第二种方法还有一些简洁的写法:如,最某表的记录数 dim count count = conn.execute(select count(*) from table)(0) 上面的语句等于 count = conn.execute(select count(*) from table).fields(0).value 综上:区别在于set rs = conn.execute是显示创建recordset对象,而conn.execute是隐式的。 能用conn.execute的时候就用conn.execute,好处有 一、代码简洁 二、效率应该有所提高 ------------------------------------------------------------------------------------- 再摘引一下:(srnld(天涯)) 形成记录集的方法有三种 CONN.execute rs.open Command.execute 方法用法大大不通 通常 Set rs=CONN.execute(SQL) 或直接 rs=CONN.execute(SQL) 和 Set rs=Server.CreateObject("ADODB.Recordset") rs.open SQL,CONN,0,1 或 rs.open SQL,CONN 这种情况 通常open比上一个性能要好那么一丁点 ( command对象更灵活,执行范围更广) 使用 CONN.execute 可以不用关闭直接执行下一个 set rs=conn.execute(SQL) 但性能速度会大打折扣!! 大约要慢 2~5倍!!(这是我在msSQL循环1000次亲自测试过的,不信你马上自己测试),所以执行下一个 rs=conn.execute之前!!一定要关闭掉!是个好习惯! 使用单一对象的rs rs.open在open下一个记录集之前,必需要求显示关闭,否则出错,速度在SQL,CONN,0,1的情况下可前者基本一样 所以我喜欢使用直设置一个 CreateObject("adodb.recordser")(在不需要多个记录集交错操作的情况下,多个也不碍是!) 然后从头用到尾!!! 开门关门开门关门~~~~~咵踏咵踏~~~~ 最后一个 set rs=nothing 化上句号,爽! 更主要是 open提供非常灵活的操作数据库元数据的非常多的属性!! 打开百宝箱,金光灿灿什么都看见! 有很多情况下是非得用open来做的! 而conn.execute 想黑布下换胶卷~~~偷偷摸摸~~非常单一!!! 比如: rs1.open SQL1,conn,0,1 rs.open SQL,conn,1,3 if rs(0)<0 then rs(0)=0 rs(1)=aaa rs(2)=bbb rs.update ' 更新记录集写到数据库 rs.addnew '加一条新记录 rs(0)=1 rs(1)=ddd rs(2)=kkk rs.update id=rs(3) rs(s) '取的字段是自动编号 立即获得新记录的自动编号id //这是非常常用的 rs1.addnew 对rs1添加关连使用id rs的新记录 rs1("id")=id rs1(1)=... .. rs1.update rs1.close:set rs1=nothing rs.close:set rs=nothing 上面的操作如果采用CONN.execute 则要用到四个 CONN.execute CONN.execute("update ..") CONN.execute("insert into 表1:") rs=CONN.execute("select 新的自动 id") CONN.execute("insert into 表二") 那一种方法逻辑条理更好~~一目了然 ====================== 还有一个有趣的使用Recordset open记录的方法!! 我想起来是有点费解 Set rs=server.CreateObject("Adodb.recordset") Set rs=server.CreateObject("Adodb.recordset") rs.open SQL1,CONN rs.open SQL2,CONN '嘿嘿~~~这是同时设置同名的两个对象来打开两个记录集,而且是可用的! '只要取的列名合乎这两个记录集中元数据 '则正常操作!! 扩展开来 Set rs=server.CreateObject("Adodb.recordset") Set rs=server.CreateObject("Adodb.recordset") Set rs=server.CreateObject("Adodb.recordset") Set rs=server.CreateObject("Adodb.recordset") rs.open SQL1,CONN rs.open SQL2,CONN rs.open SQL3,CONN rs.open SQL4,CONN 这样大于二个同名的 rs我还没试过!! 感觉有点相当与 SQL联合查询再打开记录集~~~ 以前我这样用过!!应该不是眼花!! =============== 什么时候用什么? 那就凭个人经验积累的感觉了: 如果只需要一笔带过的碰碰数据库,用execute 如果要对数据库作比较庞杂的操作!则最好用 rs.open 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wgf72/archive/2009/02/22/3920524.aspx
该文章在 2011/4/19 14:11:08 编辑过 |
关键字查询
相关文章
正在查询... |