lr 函數--lr_save_string


lr_eval_string   返回腳本中一個參數當前的值

Returns the string argument after evaluating embedded parameters.一般都用在調試腳本時輸出參數的值。

lr_save_string   ——Saves a null-terminated string to a parameter.

幫助文檔里:

char *lr_eval_string( const char *instring );
 
例子:下面的例子使用lr_eval_string來代替參數row_cnt的當前值。使用lr_output_message把這個值輸出到輸出窗口。
lrd_stmt(Csr1, "select count(*) from employee", -1, 1 /*Deferred*/, 2 /*Ora V7*/, 0);
 
lrd_bind_col(Csr1, 1, &COUNT_D1, 0, 0);
 
lrd_exec(Csr1, 0, 0, 0, 0, 0);
 
lrd_save_col(Csr1, 1, 1, 0, "row_cnt");
 
lrd_fetch(Csr1, 1, 1, 0, PrintRow2, 0);
lr_output_message("value : %s",   lr_eval_string("The row count is: {row_cnt}"));
lr_log_message(lr_eval_string("{row_cnt}"));
注:lr_eval_string是內部地分配內存。在每一次迭代之后會釋放。如果你在循環中給參數賦值,不要使用lr_eval_string保存內存。你需要使用lr_eval_string_ext,並且在每個循環迭代中使用lr_eval_string_ext_free釋放內存。
lr_eval_string_ext在關聯的數據是二進制數據,例如,數據包含嵌入的NULL字符時是非常有用的。
 
問題:常量參數?
示例代碼1:
   const char * data="abcd";
   char * data1,data2,data3 ;
   lr_message("data value: %s",data);
   lr_save_string(data,"data1"); 
   lr_message("data1 value: %s",lr_eval_string("{data1}"));
   
   lr_convert_string_encoding(data,LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"data2");
   lr_message("data2 value : %s",lr_eval_string("{data2}"));
lr_convert_string_encoding這行時,編譯不通過,type error in argument 1 to `lr_convert_string_encoding'; found `pointer to const char' expected `pointer to char' 
修改代碼,將data的定義中const去掉,則可直接運行成功。
Starting action Action.
data value: abcd
Action.c(6): Notify: Saving Parameter "data1 = abcd".
Action.c(7): Notify: Parameter Substitution: parameter "data1" =  "abcd"
data1 value: abcd
Action.c(9): Notify: Saving Parameter "data2 = abcd\x00".
Action.c(10): Notify: Parameter Substitution: parameter "data2" =  "abcd\x00"
data2 value : abcd
Ending action Action.

問題來了,那這個data參數就是這樣定義的,不能改變呢。如果用lr_eval_string函數,

   const char * data="abcd";
   char * data1,data2,data3 ;
   lr_message("data value: %s",data);   
   lr_convert_string_encoding(lr_eval_string("{data}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"data2");
   lr_message("data2 value : %s",lr_eval_string("{data2}"));

運行結果有誤:

Starting action Action.
data value: abcd
Action.c(6): Warning: The string 'data' with parameter delimiters is not a parameter.
Action.c(6): Notify: Saving Parameter "data2 = {data}\x00".
Action.c(7): Notify: Parameter Substitution: parameter "data2" =  "{data}\x00" data2 value : {data}
Action.c(9): Notify: Saving Parameter "data1 = abcd".
Action.c(10): Notify: Parameter Substitution: parameter "data1" =  "abcd"
data1 value: abcd

將data保存成一個參數,再對值轉換。

   const char * data="abcd";
   char * data1,data2,data3 ;
   lr_message("data value: %s",data);   
//   lr_convert_string_encoding(lr_eval_string("{data}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"data2");
//   lr_message("data2 value : %s",lr_eval_string("{data2}"));
      
   lr_save_string(data,"data1"); 
   lr_message("data1 value: %s",lr_eval_string("{data1}"));   
   lr_convert_string_encoding(lr_eval_string("{data1}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"data3");  
   lr_message("data3 value : %s",lr_eval_string("{data3}"));

結果:

Starting action Action.
data value: abcd
Action.c(9): Notify: Saving Parameter "data1 = abcd".
Action.c(10): Notify: Parameter Substitution: parameter "data1" =  "abcd"
data1 value: abcd
Action.c(11): Notify: Parameter Substitution: parameter "data1" =  "abcd"
Action.c(11): Notify: Saving Parameter "data3 = abcd\x00".
Action.c(12): Notify: Parameter Substitution: parameter "data3" =  "abcd\x00"
data3 value : abcd
Ending action Action.

總結:

1)遇到const 取值時,去掉const

2)將const值保存成另一個參數,通過對新值操作。

這里只是簡單的使用例子,這里為啥會用到要對參數值轉換呢?比如亂碼需要轉碼時。

 

 

 問題:在對服務器返回值重命名時部分值被去掉了

 具體描述:通過關聯取值str,str中帶%2等字符,在用函數值重命名后的新字符串中的%2沒有了。在新腳本中嘗試一下。

 測試版本:LR12.02

 測試代碼:自定義字符串、參數列表中取值,分別使用sprintf、lr_save_string函數轉換並輸出結果

Action()
{
    char * str = "sdf%2Fdcdegdfs%2opied";
    char file[100],file1[100];
    
    //對直接定義的字符串重命名
    lr_save_string(str,"strnew");
    lr_output_message("str value : %s",str);
    lr_output_message("strnew value : %s",lr_eval_string("{strnew}"));
    
    sprintf(file, "%s", str);
    lr_output_message("file value : %s",file);
    
    //對參數列表中的值重命名
    lr_output_message("value : %s",lr_eval_string("{Pname}"));    
    lr_save_string(lr_eval_string("{Pname}"),"strnew1");
    lr_output_message("strnew1 value : %s",lr_eval_string("{strnew1}"));
    sprintf(file1, "%s", lr_eval_string("{Pname}"));
    lr_output_message("file1 value : %s",file1);    

    return 0;
}
View Code

 測試結果:

Starting iteration 1.
Maximum number of concurrent connections per server: 6      [MsgId: MMSG-26989]
Starting action Action.
Action.c(7): str value : sdf%2Fdcdegdfs%2opied
Action.c(8): strnew value : sdf%2Fdcdegdfs%2opied
Action.c(11): file value : sdf%2Fdcdegdfs%2opied
Action.c(14): value : sdf%2Fdcdegdfs%2opied
Action.c(16): strnew1 value : sdf%2Fdcdegdfs%2opied
Action.c(18): file1 value : sdf%2Fdcdegdfs%2opied
Ending action Action.
Ending iteration 1.
View Code

測試結論:新字符串%2正確顯示的,並未被去掉。在后續測試時,這項再注意下。

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM