当前位置: 主页 > 数据库

打开数据库失败-plsql加载dll库失败

发布时间:2023-02-09 09:45   浏览次数:次   作者:佚名

一、简要说明

1.打开数据库

int sqlite3_open(

const char *filename, // 数据库的文件路径

sqlite3 **ppDb // 数据库实例

);

2.执行任意SQL语句

int sqlite3_exec(

sqlite3*, // 一个打开的数据库实例

const char *sql, // 要执行的SQL语句

int (*callback)(void*,int,char**,char**), // SQL语句执行后的回调

void *, // 回调函数的第一个参数

char **errmsg // 错误信息

);

3、检查SQL语句的合法性(查询前的准备)

int sqlite3_prepare_v2(

sqlite3 *db, // 数据库实例

const char *zSql, // 待检查的SQL语句

int nByte, // SQL语句的最大字节长度

sqlite3_stmt **ppStmt, // sqlite3_stmt实例,用于获取数据库数据

常量字符 **pzTail

);

4.查询一行数据

int sqlite3_step(sqlite3_stmt*); // 如果找到一行数据,将返回 SQLITE_ROW

5.使用stmt获取某个字段的值(字段下标从0开始)

双 sqlite3_column_double (sqlite3_stmt*, int iCol); // 浮点数据

int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整数数据

sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 长整型数据

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二进制文本数据

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串数据

二、SQLite编码

1. 创建、打开、关闭数据库

创建或打开数据库

// path为数据库文件的存放路径

sqlite3*db = NULL;

int result = sqlite3_open([路径 UTF8String], &db);

代码分析:

sqlite3_open()会根据文件路径打开数据库打开数据库失败,如果不存在则新建一个。如果result等于常量SQLITE_OK,则表示数据库已成功打开

sqlite3 *db: 一个开放的数据库实例

数据库文件的路径必须作为 C 字符串(不是 NSString)传入

关闭数据库:sqlite3_close(db);

2.执行不返回数据的SQL语句

执行建表语句

char *errorMsg = NULL; // 用于存储错误信息

char *sql = "如果不存在则创建表 t_person(id integer primary key autoincrement, name text, age integer);";

int result = sqlite3_exec(db, sql, NULL, NULL, &errorMsg);

代码分析:

sqlite3_exec()可以执行任何SQL语句,如建表、更新、插入、删除等操作。但一般不用于执行查询语句,因为它不会返回查询到的数据

sqlite3_exec() 也可以执行的语句:

(1) 开启交易:开始交易;

(2)回滚事务:rollback;

(3) 提交事务:commit;

3.插入带占位符的数据

char *sql = "insert into t_person(name, age) values(?, ?);";

sqlite3_stmt*stmt;

如果 (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) ==SQLITE_OK) {

sqlite3_bind_text(stmt,1,“母鸡”,-1,NULL);

sqlite3_bind_int(stmt, 2, 27);

}

如果(sqlite3_step(stmt)!= SQLITE_DONE){

NSLog(@"插入数据错误");

}

sqlite3_finalize(stmt);

代码分析:

sqlite3_prepare_v2()的返回值等于SQLITE_OK,说明SQL语句准备成功,没有语法问题

sqlite3_bind_text(): 大多数绑定函数只有 3 个参数

(1) 第一个参数是sqlite3_stmt类型 *

(2)第二个参数指的是占位符的位置,第一个占位符的位置是1,不是0

(3) 第三个参数指的是占位符要绑定的值

(4)第四个参数是指第三个参数传入的数据长度。 对于 C 字符串,可以传递 -1 而不是字符串的长度

(5) 第五个参数是一个可选的函数回调打开数据库失败,一般用来完成语句执行后的内存清理

sqlite_step():执行SQL语句,返回SQLITE_DONE表示执行成功

sqlite_finalize():销毁 sqlite3_stmt* 对象

4.查询数据

char *sql = "从 t_person 中选择 id、姓名、年龄;";

sqlite3_stmt*stmt;

如果 (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) ==SQLITE_OK) {

而(sqlite3_step(stmt)== SQLITE_ROW){

int_id = sqlite3_column_int(stmt,0);

char *_name = (char *)sqlite3_column_text(stmt,1);

NSString *name = [NSStringstringWithUTF8String:_name];

int_age = sqlite3_column_int(stmt,2);

NSLog(@"id=%i, name=%@, age=%i", _id, name, _age);

}

}

sqlite3_finalize(stmt);

代码分析:

sqlite3_step() 返回 SQLITE_ROW 遍历到一条新记录

sqlite3_column_*()用于获取每个字段对应的值,第二个参数是字段的索引,从0开始