- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2014-10-13 15:14 编辑
BetonArmEE 发表于 2014-10-13 14:32 ![]()
回复 43# yulihua49
我更懒,根本不想写SQL,所以让工具框架去写。
- //插入一个表
- static int insert_a_table(T_SQL_Connect *db_conn,FILE *xfd)
- {
- char cols[4096],stmt[4096],*p,*savep;
- char *tabname;
- int ret,i,n;
- t_node node;
- ctx_stu ctx;
- T_Tree *cols_list=NULL;
- SdbcDAO *dao;
- //取出表名、列名
- if(NULL==fgets(cols,sizeof(cols),xfd)) {
- ShowLog(1," 没有数据!",__FUNCTION__);
- return -1;
- }
- TRIM(cols);
- tabname=strtok_r(cols,":",&savep);
- if(!tabname) {
- ShowLog(1,"%s: tabname is emypt!",__FUNCTION__);
- return -1;
- }
-
- strupper(tabname);
- try {
- dao=new SdbcDAO(db_conn,tabname);
- } catch( ... ) {
- ShowLog(1,"%s:%s Table not found!",__FUNCTION__,tabname);
- return -2;
- }
- dao->Data_init();
- ctx.dp=dao;
- node.n=0;
- //生成加载列名表
- while(NULL != (p=strtok_r(NULL,",",&savep))) {
- if((255&*p) <= ' ') break;
- node.tp=dao->getTemplate(p);
- if(!node.tp) { //这个列的数据将被跳过
- ShowLog(1,"%s:%s column [%s] not found!",__FUNCTION__,tabname,p);
- }
- node.n++;
- cols_list=BB_Tree_Add(cols_list,&node,sizeof(node),node_cmp,NULL);
- }
- //加载数据
- char gbkbuf[4096];
- for(i=0;fgets(stmt,sizeof(stmt),xfd);i++) {
- /*
- if(has_cc(stmt)) {
- ret=utf8togbk(stmt, sizeof(stmt), gbkbuf, sizeof(gbkbuf));
- ctx.data=ctx.p=gbkbuf;
- } else {
- ctx.data=ctx.p=stmt;
- }
- */
- TRIM(stmt);
- ctx.data=ctx.p=stmt;
- ret=BB_Tree_Count(cols_list,&ctx,fill_cols);//每列值按列名定义的次序填充到dao。
- *stmt=0;
- ret=dao->insert(stmt);
- if(ret<0) {
- ShowLog(1,"%s:insert %s fault,i=%d,err=%d,%s",__FUNCTION__,stmt,i,
- db_conn->Errno,db_conn->ErrMsg);
- break;
- i--;
- }
- }
- BB_Tree_Free(&cols_list,NULL);
- delete dao;
- return i;
- }
复制代码 完全泛型,只处理了文件中第一行第一列,是个表名。通篇没有SQL语句。但是,那个stmt,在插入第一条记录时,会有一个语句。后来就没有了,只是用游标,绑定变量进行操作,语句只解析一次,所以效率极高。
26行,特化dao为一个表,这个比较费时间,大约需要几毫秒至几十毫秒,但是只做一次,这对于要加载的数据量而言微不足道了。
但是在做OLTP时,这个开销就很可观。所以在OLTP环境,我们尽量事先生成模板,并显式的使用结构。
这里也可以看出,我们既需要序列化/反序列化功能,也需要数据库映射功能。
对于SRM,相当于JAVA的两种ORM:你的方法,类似于ibatis,我的类似Hibernate。都有自己的应用场景。
|
|