PowerBuilder9.0 使用动态sql语句(上)

前情提要

    我们在学习vb.net的时候学习了参数化查询,也都知道这是防止SQL注入比较有效的手段。当然,参数查询还提高了代码的灵活性和复用性。其实现,是在SQL语句的动作一样时将查询的值独立出来作为参数,而SQL语句的基本内容作为框架,然后组合成完整的SQL语句。即,将SQL语句分成两部分解耦了。那么之所以,提以上内容是因为动态SQL和它一样,但是尚不清楚其是否有防止注入的作用,因为我不清楚PB9.0会如何解释参数。

    动态SQL语句和参数化查询的思路是一致的,解耦SQL语句。另外,PowerBuilder不支持有些SQL语句的嵌入执行,例如Create Table,Drop Table等这些SQL语句需要交给DBMS执行,而动态SQL语句都是将SQL语句交给DBMS执行的。因此,使用动态的SQL语句可以规避不小心犯下的错误。

内容

    动态SQL语句根据参数和结果集分为了四类:①既无输入参数,也无结果集;②有输入参数,但没有结果集;③编译时已经知道参数和结果集的列;④开发程序时尚不知道参数和结果集。类似于SQLhelper中的方法哈。

使用方法

    ①无参数无结果集

    语法格式:EXECUTE IMMEDIATE SQLStatement{USING TransactionObject};

    其中SQLStatement是个字符串,其内容是有效的SQL语句;TransactionObject是事务对象名,大括号表示该子句可以省略,默认情况下使用SQLCA。

    实例:      

         string SQL 
         SQL = "drop table T_user "
         EXECUTEIMMEDIATE :SQL  USING SQLCA;

    ②有参数无结果集(已知参数个数)

    语法格式:PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject} ;

             EXECUTE DynamicStagingAreaUSING {ParameterList} ;

    其中DynamicStagingArea是个DynamicStagingArea类型的变量,该类型的缺省全局变量是SQLSASQLStatement是个String类型的常量或者变量,其内容是有效的SQL语句,SQL语句中使用问号代表所需参数,执行时问号被EXECUTE语句中的USING子句所代表的值取代;TransactionObject是事务对象名,大括号表示该子句可以省略,省略时使用SQLCAParameterList是参数列表,可以是变量、常量或者控件的属性,参数的顺序对应问号的顺序。动态策略区用于准备SQL语句及所需参数个数,它的属性在运行时应用程序不能访问,SQLSA是缺省的动态策略区变量。

    实例:   

    Prepare SQLSA from :"update T_user set loginPwd = ? where userName=?"    //需要参数的SQL语句
    using sqlca;
    execute SQLSA using:sle_newpwd.text,:user.username;        //代入参数执行    
    注意:假设你的 SQL 语句没有语法错误时, SQLCA 表示执行结果状态的属性 SQLCA 可能会不能准确的反应。如你查询的值不存在时。 SQLCA.sqlcode 表示执行成功,但是影响行数为 0. 因此若以此判断执行情况就会错误了。另外表名和字段名不能以参数的方式来执行,具体原因不明。有知道请告知,不甚感激。

    那么关于表名和字段名在运行时也不能确定的情况可以通过如下手段解决。以②的例子为例,假设它的表名T_user和字段名userName不能确定,那么我们就先声明一个string的变量strsql用来存储需要参数的sql语句,然后再声明两个string变量分别存储表名和字段名。之后拼接成sql语句,然后再使用带参数的sql语句执行。代码如下:

   strsql="update " + table + " set loginPwd = ? where" + fieldname +  "=?"  //其中table和fieldname是表名和字段名
   Prepare SQLSA from :strsql                                                
   using sqlca;
   execute SQLSA using:sle_newpwd.text,:user.username;          //代入参数执行
    结语:思路上动态 SQL 语句和参数化查询时一致的,只是在语法结构上不太一致。动态 sql 语句为用户输入的数据与数据库之间的交互提供了便利和更高的灵活性。查过的资料显示动态 SQL 语句和数据窗口的结合使用是 PB 的一大内容,以后再说了。还有两类动态 SQL 语句因为我只是通过资料了解,还没有实践过本篇博客暂时不讲,用了之后再总结吧。

你可能感兴趣的:(PowerBuilder9.0 使用动态sql语句(上))