linux下sqlite3事务使用问题
自己写了一个sqlite3 的事务使用的程序,但运行时出现了错误,由于是新学sqlite,所以一直查不出错误原因,参考网上的sqlite事务编程和我的都大致一样,不知道我的程序哪里出了错,运行结果并没有达到网上例程的效果,所以想请诸位大神帮忙查看一下。程序如下:
#include <stdio.h>
#include "sqlite3.h"
#include <string.h>
typedef enum __bool {false = 0, true = 1,} bool;
#define CHECK_RC(rc, szInfo, NULL, db) if(rc != SQLITE_OK) { printf("%s error!\n", szInfo); sqlite3_close(db); return 0;}
static int callback(void *para, int n_column, char **column_value, char **column_name)
{
int i;
printf("记录包含%d个字段\n", n_column);
for(i = 0; i<n_column; i++)
{
printf("字段名:%s, 字段值:%s \n", column_name[i], column_value[i]);
}
return 0;
}
int main()
{
char sql[128];
sqlite3 *db;
FILE *fd;
int s_temp = 29;
int rc, i = 0;
char *zErrorMsg = 0;
// const char * selectSQL = "SELECT *
bool success_is = true;
sqlite3_stmt * stmt;
sqlite3_open("temperature.db", &db);
memset(sql, '\0', 128);
strcpy(sql, "create table if not exists tb(id INTEGER PRIMARY KEY, data TEXT)");
rc = sqlite3_exec(db, sql, NULL, NULL, NULL);
if(rc != SQLITE_OK)
{
printf("SQL exec error.\n");
return -1;
}
printf("begin transaction.\n");
if(sqlite3_exec(db, "begin transaction", 0, 0, 0) != SQLITE_OK)
{
printf(" begin transaction failed. \n");
return -1;
}
for(i = 0; i<10; i++)
{
//memset(sql, '\0', 128);
printf("begin insert.\n");
snprintf(sql, "insert into tb([id],[data]) values(%d,'%s')", i+1,"Boll"); //第二次循环时会在此处出现问题,也就是第二次insert不会成功
//strcat(sql, &s_temp);
//strcat(sql, "\")");
rc = sqlite3_exec(db, sql, NULL, NULL, &zErrorMsg);
if(rc != SQLITE_OK)
{
fprintf(stderr,"SQL exec2 error:%s\n",zErrorMsg);
printf("insert error.\n");
success_is = false;
sqlite3_free(zErrorMsg);
break;//return -1;
}
else printf("insert success.\n");
}
if(success_is)
sqlite3_exec(db, "commit transaction", 0, 0, 0);
else
sqlite3_exec(db, "rollback transaction", 0, 0, 0);
//int id = sqlite3_column_int(stmt, 0);//查询当前行第1列的整型值
//char* data1 = (char *)sqlite3_column_text(stmt, 1);
printf("begin select.\n");
char *szSql = "select * from tb";
rc = sqlite3_exec(db, szSql, callback, NULL, NULL);
CHECK_RC(rc, "query values", NULL, db);
// printf("ID: %d \n", id);
// printf("DATA1: %s \n", data1);
//sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}