基本上,使用sqlite3_open, sqlite3_close, sqlite3_exec这三个函数,可以完成了大部分的工作。但还不完善。使用sqlite3_open, sqlite3_close, sqlite3_exec这三个函数,都是直接以sql语句的形式来操作数据库,这样很容易被注入。所以有必要使用sql参数。
非回调select查询
int sqlite3_get_table(
sqlite3*, /* 已经打开的数据库句柄 */
const char *sql, /* 要执行的 Sql 语句 */
char ***resultp, /* 保存返回记录集的指针 */
int *nrow, /* 返回记录数(多少行) */
int *ncolumn, /* 返回字段数(多少列) */
char **errmsg /* 返回错误信息 */
)
功能:执行一次查询 Sql 并且返回得到一个记录集。
说明:第三个参数是查询结果,它是一维数组,内存布局为(n行m列结果),那么数组的0到m-1行是列名,m到2*m-1是记录集的第一行数据,以后的以此类推;
使用sqlite3_get_table 函数后,需要使用对应的sqlite3_free_table函数来释放查询结果所申请的内存。函数原型如下:
void sqlite3_free_table(char **result);
功能:释放掉查询结果申请的内存空间。
参数:结果集数据的首地址。
sqlite3_get_table 方式获取执行结果
#include <stdio.h>
#include "sqlite3.h"
#define STU_DB "./sql_form.db"
int main(int argc, char const *argv[])
{
sqlite3 *db = NULL;
int ret = 0;
char *sql = NULL;
char *zErrMsg = 0;
int nrow = 0; //查询到数据的行数
int ncolumn = 0; //查询到数据的列数
char **azResult;//二维数组存放的结果
if ((ret = sqlite3_open(STU_DB,&db)) != SQLITE_OK) //打开数据库
{
printf("open error!\n");
return -1;
}
else
{
printf("open database successfully\n");
}
//公司人员信息表,sql语句对象
sql = "SELECT * from COMPANY;";
if ((ret = sqlite3_get_table( db, sql, &azResult, &nrow, &ncolumn, &zErrMsg )) != SQLITE_OK )
{
printf("Sql error is =%s \n",zErrMsg);
return 0;
}
else
{
printf("nrow = %d \t ncolumn = %d\n",nrow,ncolumn); //打印查询结果表的行数跟列数
if (nrow !=0 && ncolumn != 0)
{
int i = 0, j = 0,index = 0;
index = ncolumn;
for (i = 0; i < nrow; i++) //查询结果
{
for (j = 0; j < ncolumn; j++)
{
printf("dbResult[%d]=%s\tdbResult[%d]=%s\n",j,azResult[j],index,azResult[index]);
index++;
}
printf("\n");
}
}
sqlite3_free_table(azResult); //释放掉 azResult的内存空间
//printf("Table create successfully\n");
}
sqlite3_close(db);//关闭数据库连接对象
return 0;
}
输出结果:
扫二维码关注微信公众号,获取技术干货