参数用一个特定的字符引导.参数名不能为空.有效的参数名由除括号(')'),逗号(','),分号(';')外的非空白符组成.
可用于解析参数化的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