所以,我不是一个交易程序员,但是,我一直负责一个程序,它将使用modbus协议轮询指标,然后将信息记录到数据库中。然而,今天我能够让它工作,试图改进我的代码并获得程序的主要部分(打开modbus连接,写入数据库,打开/创建数据库),以便在主要部分期间调用它们。循环,我在打开数据库时遇到了麻烦。当我调用该函数时,我在打印rc的值时得到空值,无论是在数据库的开头还是代码的表部分的创建中。
在我尝试清理代码并通过调用函数完成所有操作之前,这就是我的方法:
int main(int argc, char*argv[]){
sqlite3 *db;
//open database
int rc = sqlite3_open(db_name, &db);
if (rc != SQLITE_OK){
fprintf(stderr, "Cannot open database: %s\n",
sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
char sql_query[1024];
// create sqlite table
snprintf(sql_query,sizeof(sql_query), "CREATE TABLE IF NOT EXISTS %s(%s INTEGER PRIMARY KEY,%s TEXT NOT NULL, %s TEXT NOT NULL, %s TEXT NOT NULL,%s REAL NOT NULL, %s REAL NOT NULL, %s REAL NOT NULL);",tbl_id1,tbl_col1,tbl_col2,tbl_col3,tbl_col4,tbl_col5,tbl_col6,tbl_col7);
rc = sqlite3_exec(db, sql_query, callback, 0, NULL);
if (rc != SQLITE_OK ){
fprintf(stderr, "Failed to select data\n");
fprintf(stderr, "SQL error: %s\n", NULL);
sqlite3_free(NULL);
sqlite3_close(db);
return 1;
}
我没有像这样运行它的问题,而我正在尝试使用的函数是包含在中的相同代码
void open_Database(db){//sqlite code}
调用函数:
open_Database(db) (same db declared in the main routine)
也许你错过了这个事实,sqlite3_open()
需要指向指向sqlite3
对象的变量的指针。在原始代码中,您声明了一个指向此类对象的指针,并将该指针的地址提供给open-function。
声明执行该作业的子函数时,还应该为其指定一个指针:
void open_database (sqlite3 **db)
{
int rc;
rc = sqlite3_open(db_name, db);
// ... now do error checking
}
并且记得在调用db
时不要在sqlite3_open()
参数之前添加去参考&符号!