【 在 poggy 的大作中提到: 】
: 结构体元素太多太复杂,,
: 这种直接内存数据库管理很方便了, 无服务进程数据库, 嵌入式的内存数据库, sqlite, Berkeley db都可以用。 尤其sqlite, 直接sql语句解千愁。
哦,不那么简单。
一个上百列的大表,增删改差,一大把的操作,每次按列点名,真够呛。
以插入来说,插入语句点一次名,values(点一遍占位符),绑定变量点一次名,填充数据点一次名。烦死。
尤其是最后一项,填充数据,就是楼主的问题。无论采用离散数据,或结构体,或对象,都是一个烦人的工作。
说了半天,还是躲不掉大表的填充数据。
离散数据更烦,一个一个的枚举,结构体还有些办法集中处理。
看一个插入数据库的例子:
int loadfile(T_SQL_Connect *SQL_Connect,char *tablename,FILE *ifd,
FILE *ofd,int Pflg,char *buf,int buflen,char dlmt)
{
char *p,tabn[512];
DAU _DAU;//Data Access Unit,里边有模板,数据区,绑定变量区,游标,数据库句柄等等。
int rows,ret;
int upd,loss;
int num;
INT64 now;
ShowLog(5,"loadfile:entry dlmt=0X%02X",dlmt&255);
ret=DAU_init(&_DAU,SQL_Connect,tablename,0,0);//根据表名,从数据库建立模板,在_DAU里,就是16楼的那个。
for(rows=0;!ferror(ifd);rows++) {
fgets(buf,buflen,ifd);
if(feof(ifd)) break;
if(!(++num %10000)) {
//INT64 n1=now_usec();
ret=trans_commit(SQL_Connect);
//ShowLog(5,"commit 10000 TIMEVAL=%d",(int)(now_usec()-n1));
}
ret=DAU_pkg_dispack(&_DAU,buf,dlmt); //用14楼程序填充,怎么样,躲不掉填充大结构吧?
*buf=0;//用完了,清除buf,这个空间用于生成SQL语句。
ret=DAU_insert(&_DAU,buf);//生成插入语句,打开游标(只有第一次使用,以后一直保持打开状态),绑定变量,执行插入。
DAU_insert:
int DAU_insert(DAU *DP,char *msg)
{
。。。。。。
return bind_ins(DP,msg);//生成插入语句,绑定并插入,这个有点复杂,贴出来也没人爱看。反正就是按照模板干。
}
以下是能够从ORACLE中根据表名找出表结构的SQL模板:
static T_PkgType TAB_COLUMNS_tpl[]={
{CH_CHAR,49,"c.TABLE_NAME Fld_Tlb_Name",0,-1},
{CH_CHAR,49,"c.COLUMN_NAME Fld_Column_Name"},
{CH_CHAR,31,"c.DATA_TYPE Fld_Column_Type"},
{CH_SHORT,sizeof(short),"DATA_LENGTH Fld_Column_Len"},
{CH_SHORT,sizeof(short),"DATA_PRECISION"},
{CH_SHORT,sizeof(short),"c.DATA_SCALE Data_Scale"},
{CH_SHORT,sizeof(short),"k.POSITION Fld_PK"},
{-1,0,"ALL_TAB_COLUMNS c, "//表名表达式
"(SELECT C2.TABLE_NAME,C2.COLUMN_NAME,C2.POSITION "
"FROM USER_CONSTRAINTS C1,USER_CONS_COLUMNS C2 "
"WHERE C1.OWNER = :Fld_Column_Name AND "
"C1.TABLE_NAME=:Fld_Tlb_Name AND C1.CONSTRAINT_TYPE='P' AND "
"C2.CONSTRAINT_NAME=C1.CONSTRAINT_NAME) k ",0}
}
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*