参数化串解析器使用示例

参数用一个特定的字符引导.参数名不能为空.有效的参数名由除括号(')'),逗号(','),分号(';')外的非空白符组成.
可用于解析参数化的SQL命令,如:
.select * from where f1=@v1  and f2=@v2

执行查询
.call test_sp1(@f1)
调用存储过程

也可以用于模板化信息(如"您收到来自@orgid_name的@sheet_type_name,单据编号为@sheet_id").

未考虑转义.
对于模板化信息,设计模板时避免出现参数引导符.
对于参数化SQL,仍然存在这种可能.如就是要按f1的内容等于@v1的记录。(当然这种情形在应用中并不常见)
未来如果有此情况,可以用"\"做为转义符."\@"表示"@"本身,用"\\"表示"\".

使用时直接在工程中加入以下文件:
.common\ParamStrParser.h
.common\ParamStrParser.cpp


使用示例:

int Test(const char *cmd) {
 CParamStrParser parser;
 parser.Parse(cmd);
 int para_num = parser.GetParamNum();
 for (int k=0;k<para_num;k++) {
  stParamPair *pp = parser.GetParam(k);

    /// 设置参数值pp->value_ = ???;
 }
 char *buffer; ///< 指向替换参数后的串缓冲区
 parser.Instance(&buffer);
 ///< 使用buffer,如执行SQL命令
 
 delete []buffer;

 return 0;
}

int main() {
 char cmd[] = "select * from where f1=@v1  and f2=@v2";
 Test(cmd);
 
 return 0;
}


头文件:
ParamStrParser.h

/// 参数化串解析器

#ifndef H_PARAMSTRPARSER
#define H_PARAMSTRPARSER

#include "auto_pointer.h"
#include <string>

//
struct stParamPair {
 string name_;
 string value_;
public:
 stParamPair() {
 }
};

//
///< 参数位置信息
///< 一个参数可能出现多次
struct stParamPos{
 stParamPair *para_;
 size_t pos_;
};

//
class CParamStrParser {
 const char *s_; ///< 待分析的字符串
 char prefix_char_; ///< 参数引导符
 
 CAutoVector<stParamPair*> params_;
 CAutoVector<stParamPos*> params_pos_; ///< 参数位置信息
 int GetParaName(const char *p);
 int AddParam(const char *name,size_t pos); ///< 记录参数信息
 stParamPair* FindParam(const char *name);

public:
 CParamStrParser();
 int Parse(const char *s);
 int Instance(char **ppbuf);///< 获取串的实例

 unsigned short GetParamNum() { return params_.size(); }
 stParamPair* GetParam(unsigned short index) { return params_[index]; }
 int SetParaValue(const char *name,const char *value); ///< 设置参数值
 static stParamPair* FindParam(vector<stParamPair*> *vpp,const char *name);
};

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值