1. 程式人生 > >PowerBuilder9.0 使用動態sql語句(上)

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語句因為我只是通過資料瞭解,還沒有實踐過本篇部落格暫時不講,用了之後再總結吧。