- 論壇徽章:
- 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。都有自己的應用場景。
|
|