打开数据库失败-plsql加载dll库失败
一、简要说明
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开始