直接贴代码With MyComm
        .ActiveConnection = Cn           '数据连接
        .CommandType = adCmdStoredProc   '表明这是一个存储过程
        .Prepared = True                 '要求将SQL命令先行编译
        
    Select Case xTab                     '根据不同的TAB值,选择不同的存储过程和参数
        Case 4
            .CommandText = "SP_Ping_Dialtest"             '存储过程名称
            Set param = .CreateParameter("@GroupCol", adVarChar, adParamInput, 30, "network_type") ' cmbStats(3).Text)  '申明一个参数
                        .Parameters.Append param         '把参数添加到参数列表里
            Set param = .CreateParameter("@IGOOD", adInteger, adParamInput, 8, Int(ReadIni("Define", "PING_TIME_LAPSE_GOOD", IniFile)))
                        .Parameters.Append param
            Set param = .CreateParameter("@IStandard", adInteger, adParamInput, 8, Int(ReadIni("Define", "PING_TIME_LAPSE_STANDARD", IniFile)))
                        .Parameters.Append param
            Set param = .CreateParameter("@Terminal_NO", adVarChar, adParamInput, 30, "20090101") ' Trim(txtPosNum.Text))
                        .Parameters.Append param
            Set param = .CreateParameter("@Terminal_TYPE", adVarChar, adParamInput, 30, "1") 'Trim(cmbPosType.Text))
                        .Parameters.Append param
            Set param = .CreateParameter("@NETWORK_TYPE", adVarChar, adParamInput, 8, "1") ' Trim(cmbNetType.Text))
                        .Parameters.Append param
            Set param = .CreateParameter("@TASK_NAME", adVarChar, adParamInput, 50, "2GG") ' Trim(txtTaskName.Text))
                        .Parameters.Append param
            Set param = .CreateParameter("@AREA_CENTER_ID", adInteger, adParamInput, 8, 1) ' Trim(cmbPosArea.ItemData(cmbPosArea.ListIndex)))
                        .Parameters.Append param
            Set param = .CreateParameter("@STARTTIME", adVarChar, adParamInput, 30, Format(DTPBeginDay.Value & " " & DTPBeginTime.Value, "YYYY-MM-DD HH:MM:SS"))
                        .Parameters.Append param
            Set param = .CreateParameter("@ENDTIME", adVarChar, adParamInput, 30, Format(DTPEndDay.Value & " " & DTPEndTime.Value, "YYYY-MM-DD HH:MM:SS"))
                        .Parameters.Append param
    End Select
        Set Rs = .Execute这样是传递参数进去,用command 对象获取记录集,第一个方法set rs=cn.exec("select * from AAA")  直接执行SQL命令,第二个方法
create procedure aa()
begin
   select * from AAA;
endset rs=cn.exec("call aa()")      第三种方法。第三种方法把存储过程当SQL命令来执行,这样和第二种,第一种方法有什么区别??

解决方案 »

  1.   

    1和2的区别就是一个是存储过程一个是in line query
    如果说区别可以详细看看为什么存储过程在执行复杂query的时候效率高。大概就是存储过程在server那里执行,而且是已经优化好的。
    还有就是代码管理的问题。对于查询有调整,1的方法调整server上的存储过程就好了不需要对代码进行调整(参数不变),2就是要对代码进行调整。两种方法在最终如何给客户更新上就出现了区别对于简单的查询两种方法效率上区别不大。我不知道第三种方法也没用过
      

  2.   

    前两种相比,如果存储过程里面只有一条简单的Select语句的话,基本没差别,顶多也就是提交指令的时候少传几个字节的字符而已。个人认为只有在同时处理多条语句的时候存储过程才能体现出性能。
      

  3.   

    第三种方法难道是我独创的??哈哈。第三种方法,把存储过程的参数连接成一个字符串,我觉得到CN执行的时候,还是SQL命令了。这种方法我以前经常用,但是没有深究过他们的原理和效率高手们过来聊聊各自的见解啊。。分不够我再加。。200都没问题。
      

  4.   

    clear_zero 你去看看我那帖子吧 看能不能帮我解决下问题
    是关于自适应分辨率的 谢谢
      

  5.   


    我写的SELECT只是做个简单的例子,如果能够用到存储过程,一般都有比较复杂的业务做在里面了。。
      

  6.   

    当有多条语句的时候需要处理的时候有三种方式:
    1、
    Conn.execute 语句1
    conn.execute 语句2
    conn.execute 语句32、
    conn.execute "语句1;语句2;语句3"3、把语句1、语句2、语句3写到存储过程里面,直接执行存储过程。方法1是一条一条的执行速度应该是最慢的,方法2是批处理,数据库会预编译并进行优化,方法3是存储过程预编译和优化的过程已经提前完成,所以方法3是最快的,方法2其次,方法1最慢!
      

  7.   

    存储过程效率好,存储过程一般只在创建时编译,重新执行无需再重新编译,而SQL语句每执行一次就编译一次
    存储过程安全性高,可靠性好,参数是对象,防范SQL注入,同时程序中无需对参数中的特殊字符作额外处理...
      

  8.   

    存储过程可不见得就一定能防范SQL注入,关键看怎么去执行存储过程,如果用:
    conn.execute "EXEC 存储过程名 参数,参数,参数" 或者
    command.execute "Exec …………"
    这种方式,该注入的还是一样的注入
    如果用Parameters对象来包裹参数,就像搂住那样的,即便不用存储过程也不会被SQL注入。
      

  9.   


    对的,我是指楼主第一种方法,command.execute
      

  10.   

    我自己是习惯参数化方式,即使ACCESS也是尽量用Parameters,安全可靠,连SQL语句也好写许多...
      

  11.   


    第三种方法执行存储过程和第一种方法执行存储过程,除开注入啥的,在效率上有什么区别吗??第三种方法写起来很方便。。在执行的时候,她是当SQL语句执行还是当存储过程执行?
      

  12.   

    这样就该结贴了??第三种方法,把存储过程的参数连接成一个字符串,我觉得到CN执行的时候,还是SQL命令了。 这种方法我以前经常用,但是没有深究过他们的原理和效率 有谁说清楚第三种方法和第一种方法有什么区别了吗?
      

  13.   

    我说是这个,
    http://topic.csdn.net/u/20091012/10/1a8c6307-47a7-46e3-876e-6eb76764e0b8.html?91901
      

  14.   

    没玩过VB的存储过程。胡乱YY一下……假如存储过程在数据库中有对应的索引,或许楼主的第三种call方法或许会更高效,因为这样不用去解析SQL语句。
      

  15.   

    可以用Call aaa()来调用存储过程么?exec吧?
    合适的Commandtype和Prepared都会影响执行性能。用Connection的Execute方法需要指定Options值来达到同样的效率。
    我不喜欢用CreateParameter,代码太多了,直接用.Parameters("@参数名称")方便多了
    Command可以持续查询,Connection或Recordset不行。
      

  16.   

    第三种我也没见过,mysql也没用过....
      

  17.   

    在同等环境条件下,第一,二种在执行时,直接被解释执行,但第三种形式,在调用时,会被SQL先重新编译一下,aa()这个过程,然后执行.
    一般区别都在服务器的开销上面,就像迅雷提出的一个面试题上一样:说JSP的大多数页面为什么都需要重新创建一个CONNECT,而不是共享一个CONNECT,这样做的好处是什么?
    我个人理解就开销上面的区别,合理运用数据缓冲池,如果N多页面共享一个CONNECT则,在缓冲池中的连接信息将被无限加深,久而久之会出现一些脏数据,会影响整个连接速度.
    那么如果多次的创建CONNECT,数据缓冲池中则会存在很多对象(直到此对象被销毁),那么连接速度一样会受到影响
      

  18.   

    你的这种写法是在哪个版本的SQL Server里的,貌似SQL Server2000不支持,是不是写错了,应该是Create Function a()这样的?
      

  19.   

    第三种方法可以呀。。
    你在查询分析器里去执行,不是用exec spname(1,2,3) 这样的调用吗??把这个当一个SQL命令来执行,当然可以嵌入到代码里面的。。我写的CALL SPNAME() 这样是MYSQL的语法。。
      

  20.   

    把存储过程当SQL命令来执行,计算会放到服务器上,客户端只要满足要求的结果,网络传送的是一个存储过程当的名字,运行速度快
    使用SQL语句,网络传送的是一个字符串,客户端也是得到满足要求的结果
    用command 对象传送的东西要多吧?所以,你可以从传送的内容多少,在哪边执行来考虑,大脑中始终有服务器,网络和客户端三个概念大胡子不光能顶帖子吧?