sprintf、fprintf和printf这三个函数区别为:输出不同、参数不同、重定向不同。
一、输出不同
1、sprintf函数:sprintf函数是把格式字符串输出到指定文件设备中。
2、fprintf函数:fprintf函数是把格式字符串输出到指定字符串中。
3、printf函数:printf函数是把格式字符串输出到标准输出中。
二、参数不同
1、sprintf函数:sprintf函数参数比printf多一个char*。
2、fprintf函数:fprintf函数参数比printf多一个文件指针FILE*。
3、printf函数:printf函数参数为字符串string。
三、重定向不同
1、sprintf函数:sprintf函数不可以重定向。
2、fprintf函数:fprintf函数不可以重定向。
3、printf函数:printf函数可以重定向。
sprintf是C语言标准库提供的函数, 包含在stdio.h中, 只要在文件头#include <stdio.h>即可.原型为int sprintf ( char * str, const char * format, ... )
用于按格式化方式(%d %f %c %s等)将数据写入字符串.
PS. 用sprintf记得考虑写入内存区域的大小问题, 小心别越界了. 可换用snprintf, 加一个参数后不易出错.
你只要取多行是不?我给你一段代码参考
while (OCIStmtFetch(env->stmthp, env->errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_NO_DATA)
{
count = data->num_column
DataLink = (CHECK_DATA *) malloc(sizeof(CHECK_DATA))
len = 0
if(data->num_column >1)
{
while (count--)
{
sprintf(&((DataLink->buf)[len]), "%s%c", data->buf[count],'$')
len += strlen(data->buf[count])+1
}
}
else
sprintf(DataLink->buf, "%s", data->buf[0])
DataLink->next = NULL
DataLink->next = head->next
head->next = DataLink
data->num_row++
}
这个就是循环取数据
只是我这里用了链表 和把多个字段合成一个字段存入到了链表 取出来用的时候再把多个字段分离
这个fetch 函数的参数 OCI_FETCH_NEXT, 表示一次 取一条数据 不管你有多少列 一次取一条记录 具体列数通过它返回的结构体力的num_column取得/
另外你所说的批量插入是啥意思 我后台程序 每30秒插入一次数据一次插入4096条,貌似没有什么批量的概念。我不懂你的意思 我给你我插入数据的代码demo
int oci_excu(OCI_ENV *env,text *sql,int flag)
{
/******** OCIStmtPrepare() 解析SQL语句 **********/
if(OCIStmtPrepare(env->stmthp, env->errhp, sql, (ub4)strlen((char *)sql), OCI_NTV_SYNTAX, OCI_DEFAULT))
return 0
/******** OCIStmtExecute() 执行SQL语句 **********/
if(OCIStmtExecute(env->svchp, env->stmthp, env->errhp, (ub4) 1, (ub4) 0,(CONST OCISnapshot *) NULL,(OCISnapshot *) NULL, OCI_DEFAULT | OCI_COMMIT_ON_SUCCESS))
return 0
/******** OCITransCommit() 进行事务的提交,不提交回滚 **********/
if(flag)
{
if(OCITransCommit(env->svchp,env->errhp,(ub4)0))
return 0
}
return 1
}
if (distance >0.0001)
{
sprintf(tName,"GPS_%d_Y",tf[k]) // 数据库表名
InsertHash(temp, pHash, MAX_REC<<2) // 插入
if(interval == 0 || interval >420)
node = 1
else
node = 0
sprintf(sql,"insert into %s (id,tm_id,lon,lat, speed,utc_time,udate,mileage,DIRECTION,DISTANCE,INTERVAL,node,term_stat,RESERVE,reserve1) values (seq_gps.nextVal,'%s','%f','%f','%f','%d','%d','%f','%d','%f','%d','%d','%d','%s','%s')",
tName,GpsRec[i].tid,GpsRec[i].lon,GpsRec[i].lat,GpsRec[i].speed,GpsRec[i].utime,GpsRec[i].udate,GpsRec[i].mileage,GpsRec[i].dir,distance,interval,node,GpsRec[i].stat,GpsRec[i].alltime,dirc[GpsRec[i].dir])
// printf("%s\n",sql)
sem_wait(&sem_or) // 挂起信号
oci_excu(oracle_env,(text *)sql,0) // 插入数据
sem_post(&sem_or) // 信号解锁
memset(tName,0x00,10)
}
循环插入数据即可 你所指批量莫非就是这个意思? 另外OCIDefineByPos 这个函数的介绍随便百度下好像都解释的很清楚了 你不明白的地方是哪里??
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)