在本文中,我们想介绍有关结合C++或C的SQLITE的文章。
在继续本教程之前,我们需要遵循SQLITE3的安装过程,该过程可在此处轻松找到。同时,需要具备SQL的基本知识。
我们将显示以下操作:
- 数据库连接/创建
- 建立表格
- 插
- 删除
- 选择
为了简单起见,让我们使用一个仅由一个表组成的简单数据库。
数据库连接/表创建
在此代码段中,我们将使用sqlite3.h库中包含的两个例程。
- sqlite3_open(const char *filename, sqlite3 **ppDb)
- sqlite3_close(sqlite3 *ppDb)
通过添加命令-l sqlite3来执行编译。
#include
#include
int main(int argc, char** argv)
{
sqlite3* DB;
int exit = 0;
exit = sqlite3_open("example.db", &DB);
if (exit) {
std::cerr << "Error open DB " << sqlite3_errmsg(DB) << std::endl;
return (-1);
}
else
std::cout << "Opened Database Successfully!" << std::endl;
sqlite3_close(DB);
return (0);
}
输出:
$ g++ createDB.cpp -l sqlite3
$ ./a.out
Opened Database Successfully!
$ ls
create.cpp
a.out
example.db
第一个例程返回一个整数:如果该整数等于0,则它成功。如果该数据库尚不存在,则将在执行该过程的同一目录中创建该数据库。
第二个只是关闭先前由SQLITE3_OPEN()打开的连接。
与连接关联的所有准备好的语句应在关闭连接之前完成。
建立表格
在此代码段中,我们将使用以下例程:
- sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
#include
#include
int main(int argc, char** argv)
{
sqlite3* DB;
std::string sql = "CREATE TABLE PERSON("
"ID INT PRIMARY KEY NOT NULL, "
"NAME TEXT NOT NULL, "
"SURNAME TEXT NOT NULL, "
"AGE INT NOT NULL, "
"ADDRESS CHAR(50), "
"SALARY REAL );";
int exit = 0;
exit = sqlite3_open("example.db", &DB);
char* messaggeError;
exit = sqlite3_exec(DB, sql.c_str(), NULL, 0, &messaggeError);
if (exit != SQLITE_OK) {
std::cerr << "Error Create Table" << std::endl;
sqlite3_free(messaggeError);
}
else
std::cout << "Table created Successfully" << std::endl;
sqlite3_close(DB);
return (0);
}
输出:
$ g++ createTable.cpp -l sqlite3
$ ./a.out
Table created Successfully
此例程返回一个整数:如果该整数等于SQLITE_OK宏,则一切正常。
对于此示例,省略了有关数据库打开的控件,这些控件是在过去的代码中编写的。
插入和删除
我们还将对插入使用SQLITE3_EXEC()例程。程序和检查与上一个类似。我们与SQLITE3_EXEC()一起使用的字符串只有一个区别。
#include
#include
#include
using namespace std;
static int callback(void* data, int argc, char** argv, char** azColName)
{
int i;
fprintf(stderr, "%s: ", (const char*)data);
for (i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char** argv)
{
sqlite3* DB;
char* messaggeError;
int exit = sqlite3_open("example.db", &DB);
string query = "SELECT * FROM PERSON;";
cout << "STATE OF TABLE BEFORE INSERT" << endl;
sqlite3_exec(DB, query.c_str(), callback, NULL, NULL);
string sql("INSERT INTO PERSON VALUES(1, 'STEVE', 'GATES', 30, 'PALO ALTO', 1000.0);"
"INSERT INTO PERSON VALUES(2, 'BILL', 'ALLEN', 20, 'SEATTLE', 300.22);"
"INSERT INTO PERSON VALUES(3, 'PAUL', 'JOBS', 24, 'SEATTLE', 9900.0);");
exit = sqlite3_exec(DB, sql.c_str(), NULL, 0, &messaggeError);
if (exit != SQLITE_OK) {
std::cerr << "Error Insert" << std::endl;
sqlite3_free(messaggeError);
}
else
std::cout << "Records created Successfully!" << std::endl;
cout << "STATE OF TABLE AFTER INSERT" << endl;
sqlite3_exec(DB, query.c_str(), callback, NULL, NULL);
sql = "DELETE FROM PERSON WHERE ID = 2;";
exit = sqlite3_exec(DB, sql.c_str(), NULL, 0, &messaggeError);
if (exit != SQLITE_OK) {
std::cerr << "Error DELETE" << std::endl;
sqlite3_free(messaggeError);
}
else
std::cout << "Record deleted Successfully!" << std::endl;
cout << "STATE OF TABLE AFTER DELETE OF ELEMENT" << endl;
sqlite3_exec(DB, query.c_str(), callback, NULL, NULL);
sqlite3_close(DB);
return (0);
}
输出:
$ g++ insertDelete.cpp -l sqlite3
$ ./a.out
STATE OF TABLE BEFORE INSERT
Records created Successfully!
STATE OF TABLE AFTER INSERT
ID = 1
NAME = STEVE
SURNAME = GATES
AGE = 30
ADDRESS = PALO ALTO
SALARY = 1000.0
ID = 2
NAME = BILL
SURNAME = ALLEN
AGE = 20
ADDRESS = SEATTLE
SALARY = 300.22
ID = 3
NAME = PAUL
SURNAME = JOBS
AGE = 24
ADDRESS = SEATTLE
SALARY = 9900.0
Record deleted Successfully!
STATE OF TABLE AFTER DELETE OF ELEMENT
ID = 1
NAME = STEVE
SURNAME = GATES
AGE = 30
ADDRESS = PALO ALTO
SALARY = 1000.0
ID = 3
NAME = PAUL
SURNAME = JOBS
AGE = 24
ADDRESS = SEATTLE
SALARY = 9900.0
选择
在继续显示Select操作之前,我们可以很容易地考虑所有教程中最重要的部分,让我们看一下将在示例中使用的Callback原型。
通过此操作,我们可以从“选择”操作中获取输出:
typedef int (*sqlite3_callback)(
void*, /* Data provided in the 4th argument of sqlite3_exec() */
int, /* The number of columns in row */
char**, /* An array of strings representing fields in the row */
char** /* An array of strings representing column names */
);
现在,我们将在下一个代码片段中将“回调”函数用于“选择”中:
#include
#include
using namespace std;
static int callback(void* data, int argc, char** argv, char** azColName)
{
int i;
fprintf(stderr, "%s: ", (const char*)data);
for (i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char** argv)
{
sqlite3* DB;
int exit = 0;
exit = sqlite3_open("example.db", &DB);
string data("CALLBACK FUNCTION");
string sql("SELECT * FROM PERSON;");
if (exit) {
std::cerr << "Error open DB " << sqlite3_errmsg(DB) << std::endl;
return (-1);
}
else
std::cout << "Opened Database Successfully!" << std::endl;
int rc = sqlite3_exec(DB, sql.c_str(), callback, (void*)data.c_str(), NULL);
if (rc != SQLITE_OK)
cerr << "Error SELECT" << endl;
else {
cout << "Operation OK!" << endl;
}
sqlite3_close(DB);
return (0);
}
输出:
$ g ++ select.cpp -l sqlite3
$ ./a.out
Opened Database Successfully!
RESULT OF SELECT
ID = 1
NAME = STEVE
SURNAME = GATES
AGE = 30
ADDRESS = PALO ALTO
SALARY = 1000.0
ID = 3
NAME = PAUL
SURNAME = JOBS
AGE = 24
ADDRESS = SEATTLE
SALARY = 9900.0
Operation OK!
本文提供了使用C++ / C的带有SQLITE3的数据库的快速指南。
在我们的示例中,我们使用了C++,但是当我们传递字符串,我们调用了c_str()方法,以便将字符串转换为字符数组:这证明了所使用的所有例程也可以在C语言中使用。
本文是与那不勒斯·帕特诺佩大学科学技术系的维托里奥·特里西( Vittorio Triassi)学生合作编写的。