SQLite C/C++ 增删改查

运行代码在文末

一 准备

C下要加入的头文件   

#include "sqlite3.h"

用到的头文件密码:gboy


二 3个常用 C/C++ api

sqlite3_open(const char *filename, sqlite3 **ppDb) 

sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)

sqlite3_close(sqlite3*)

注意点:

sqlite3_exec提供一个执行 SQL 命令的快捷方式 ,sqlite_callback为回调函数,具体如下

// int sqlite_callback( 
// void* pvoid, /* 由 sqlite3_exec()  的第四个参数data 传递而来,其他参数会自动赋值 */ 
// int argc, /* 表的列数 */ 
// char** argv, /* 指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到 */ 
// char** col /* 指向表头名的指针数组, 可以由 sqlite3_column_name() 得到 */ 
// );
回调函数要加return 语句 ,否则errmsg会赋值会
 
SQLITE_ABORT        4   /* Callback routine requested an abort */

三代码

#include <stdio.h>
#include <stdlib.h> //exit等函数的声明
#include "sqlite3.h"

int displaycb(void *para,int n_column,char **column_value,char **column_name);

int inquire_Usecb(sqlite3 *db);

int inquire_nocb(sqlite3 *db);

int createTable(sqlite3 *db);

int insertRecord(sqlite3 *db);

int deleteRecord(sqlite3 *db);

//回调函数格式
/* 
int sqlite_callback( 
void* pvoid,  //由 sqlite3_exec() 的第四个参数传递而来 
int argc,  //表的列数 
char** argv, //指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到  
char** col //指向表头名的指针数组, 可以由 sqlite3_column_name() 得到 
); 
*/

//回调函数 每一条记录执行一次
int displaycb(void *para,int n_column,char **column_value,char **column_name)
{
	int i = 0;
	printf("Total column is %d\n",n_column);
	for(i = 0;i<n_column;i++){
		printf("字段名: %s---->字段值:%s\n",column_name[i],column_value[i]);
	}
	printf("==========================\n");
	return 0;
}
//使用回调函数的查询
int inquire_Usecb(sqlite3 *db)
{
	char *sql;
	char *zErrMsg;
	sql = "select * from 'SensorData';";
	if(SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}
	return 0;
}
//不使用回调函数的查询
int inquire_nocb(sqlite3 *db)
{
	int nrow = 0,ncolumn = 0;
	char **azResult=0;
	int i = 0;
	char *sql;
	char *zErrMsg;
	sql = "SELECT * FROM SensorData";
	if(SQLITE_OK != sqlite3_get_table(db,sql,&azResult,&nrow,&ncolumn,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}

	printf("row:%d column = %d\n",nrow,ncolumn);
	printf("The result of querying is :\n");
	for ( i = 0;i < ( nrow + 1) * ncolumn; i++)
		printf("azResult[%d] = %s\n",i,azResult[i]);
	sqlite3_free_table(azResult);
	return 0;
}
//创建表函数
int createTable(sqlite3 *db)
{
	char *zErrMsg = 0;
	char *sql = "CREATE TABLE SensorData(ID INTEGER PRIMARY KEY,SensorID INTEGER,SiteNum INTERER,Time VARCHAR(12),SensorParameter REAL);";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}
}
//插入数据函数
int insertRecord(sqlite3 *db)
{
	char *sql;
	char *zErrMsg;
	sql = "INSERT INTO 'SensorData' VALUES(NULL,101,261,'20100314',18.9);";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}

	sql = "INSERT INTO 'SensorData' VALUES(NULL,369,281,'20100616',113);";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}

	sql = "INSERT INTO 'SensorData' VALUES(NULL,667,290,'20110315',27);";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}

	sql = "INSERT INTO 'SensorData' VALUES(NULL,865,300,'20120616',323);";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}

}
//删除数据函数
int deleteRecord(sqlite3 *db)
{
	char *sql;
	char *zErrMsg;
	char **azResult=0;
	int nrow = 0,ncolumn = 0;
	int i;
	sql = "DELETE FROM SensorData WHERE ID=4;";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}

	sql = "SELECT * FROM SensorData;";
	if(SQLITE_OK != sqlite3_get_table(db,sql,&azResult ,&nrow,&ncolumn,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}
	printf("row:%d column:%d\n",nrow,ncolumn);
	printf("After deleting,the result of querying is :\n");
	for(i=0;i<(nrow+1)*ncolumn;i++)
		printf("azResult[%d] = %s\n",i,azResult[i]);
	sqlite3_free_table(azResult);
}
 
int main(void)
{
	sqlite3 *db = NULL;
	int rc;

	//打开指定的数据库文件
	rc = sqlite3_open("mydatabase.db",&db);
	if(rc){
		fprintf(stderr,"can't open database: %s\n",sqlite3_errmsg(db));
		sqlite3_close(db);
		exit(1);
	}else
		printf("You have opened a sqlite3 database successfully!\n");
	//创建表
	createTable(db);
	//插入记录
	insertRecord(db);
	//查询
	//使用sqlite3_get_table实现查询
	inquire_nocb(db);
	printf("ppppppppppppppppppppppppppppppppppp\n"); 
	
	
	//使用回调函数实现查询
	inquire_Usecb(db);
	//删除记录
	deleteRecord(db);
	//关闭数据库
	sqlite3_close(db);
	return 0;
}


C++ 中操作数据库需要使用数据库 API,比如MySQL的C API或者SQLite的C API。 下面是一个基本的增删改查的例子,以MySQL为例: ```c++ #include <iostream> #include <mysql/mysql.h> int main() { MYSQL *conn = mysql_init(NULL); if (conn == NULL) { std::cerr << "Error: mysql_init()" << std::endl; return EXIT_FAILURE; } if (mysql_real_connect(conn, "localhost", "username", "password", "database", 0, NULL, 0) == NULL) { std::cerr << "Error: mysql_real_connect()" << std::endl; return EXIT_FAILURE; } // 插入数据 std::string insert_sql = "INSERT INTO table_name (col1, col2) VALUES ('value1', 'value2')"; if (mysql_query(conn, insert_sql.c_str()) != 0) { std::cerr << "Error: mysql_query()" << std::endl; return EXIT_FAILURE; } // 删除数据 std::string delete_sql = "DELETE FROM table_name WHERE col = 'value'"; if (mysql_query(conn, delete_sql.c_str()) != 0) { std::cerr << "Error: mysql_query()" << std::endl; return EXIT_FAILURE; } // 更新数据 std::string update_sql = "UPDATE table_name SET col1 = 'new_value' WHERE col2 = 'value2'"; if (mysql_query(conn, update_sql.c_str()) != 0) { std::cerr << "Error: mysql_query()" << std::endl; return EXIT_FAILURE; } // 查询数据 std::string select_sql = "SELECT * FROM table_name"; if (mysql_query(conn, select_sql.c_str()) != 0) { std::cerr << "Error: mysql_query()" << std::endl; return EXIT_FAILURE; } MYSQL_RES *result = mysql_use_result(conn); MYSQL_ROW row; while ((row = mysql_fetch_row(result))) { std::cout << row[0] << "," << row[1] << std::endl; } mysql_free_result(result); mysql_close(conn); return EXIT_SUCCESS; } ``` 需要注意的是,这只是一个简单的例子,实际使用中需要注意SQL注入等安全问题。此外,对于更复杂的数据库操作,可以使用ORM库(比如Qt的QSql)来简化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值