我正在编写一个轻巧,快速的Gtk应用程序,它的大小应足够小,以供空白的独立Rasberry Pi安装程序使用,以供我的工作同事进行自我排练。输出将是拇指驱动器上的CSV文件,供我的Line Manager在Excel中打开。对我来说,读写.xlsx文件可能是一个太遥远的步骤……^ _〜
用于永久存储的Sqlite数据库。
我需要知道是否存在使我能够系统地查询行以将数据复制到数组(也许也为结构)中以便在C中进行分析(名册冲突等)的函数。我读过Java具有游标,C等效什么?
答案 0 :(得分:1)
我需要知道是否存在使我能够系统地查询行以将数据复制到数组(也许也是结构)中以进行C语言分析的功能
在SQLite的C API中没有将整个数组或结构与SQLite行关联的功能。您将需要使用sqlite3_column_xxx()
来检索结构或数组的每个元素(例如sqlite3_column_int()
来获取整数值)。
例如,假设您有一个struct
,例如:
typedef struct {
int employee_id;
int day_of_month;
int shift_no;
} roster_entry_t;
和具有匹配模式的SQLite表,您将使用以下函数检索这些结构的数组:
int get_roster_entries(sqlite3 *db, roster_entry_t *roster, int max,
int *count) {
sqlite3_stmt *stmt = NULL;
int rc = 0;
int i = 0;
rc = sqlite3_prepare_v2(
db, "SELECT employee_id, day_of_month, shift_no FROM roster LIMIT ?",
-1, &stmt, NULL);
if (rc != SQLITE_OK) {
fprintf(stderr, "Failed to prepare SQL: %s\n", sqlite3_errmsg(db));
return 1;
}
rc = sqlite3_bind_int(stmt, 1, max);
if (rc != SQLITE_OK) {
fprintf(stderr, "Problem setting limit: %s\n", sqlite3_errmsg(db));
return 1;
}
do {
roster_entry_t *entry = &roster[i++];
rc = sqlite3_step(stmt);
if (rc == SQLITE_DONE) {
printf("No more rows ...\n");
break;
} else if (rc != SQLITE_ROW) {
fprintf(stderr, "Problem: %s\n", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
return 1;
}
entry->employee_id = sqlite3_column_int(stmt, 0);
entry->day_of_month = sqlite3_column_int(stmt, 1);
entry->shift_no = sqlite3_column_int(stmt, 2);
} while (i < max);
*count = i - 1;
sqlite3_finalize(stmt);
return 0;
}
注释
sqlite3_bind_xxx()
将程序中的变量与SQL中的占位符相关联。sqlite3_bind_xxx()
的数组索引从1开始,而sqlite3_column_xxx()
的数组索引从0开始(有点令人困惑)。