我用SQLite的功课被困住了。我使用 2 列;第一个用于产品,第二个用于计数。用户添加新产品,这将更新计数。我们必须控制,用户不会再次添加相同的产品,或者阻止他选择比可用更多的单位。我们必须经常使用它,所以我创建了函数:
int exists(char *param, sqlite3** ppDb) //0 if product exists
{
int error = 0;
char *a = NULL;
sqlite3_stmt **ppStmt = NULL;
const char **pzTail = NULL;
char *zSQL = sqlite3_mprintf("SELECT 'products' FROM 'table' WHERE 'products' LIKE '%q'", param);
//HERE IT FALS
error = sqlite3_prepare_v2(
*ppDb, /* Database handle */
zSQL, /* SQL statement, UTF-8 encoded */
(sizeof(zSQL)+1), /* Maximum length of zSql in bytes. */
ppStmt, /* OUT: Statement handle */
pzTail /* OUT: Pointer to unused portion of zSql */
);
sqlite3_free(zSQL);
a = (char*) sqlite3_column_text(*ppStmt, 0);
return strcmp(a, param); //0 if same -> product is in db yet
}
//similar one for count
叫
int main(int argc, const char *argv[])
{
sqlite3 *pDb;
int error = 0;
//parsing input
error = sqlite3_open(argv[1], &pDb);
if (error == 0)
{
sqlite3_exec(
pDb, /* An open database */
"CREATE TABLE 'table' ('products', 'quantity')", /* SQL */
0, /* Callback function */
NULL, /* 1st argument to callback */
NULL /* Error msg written here */
);
if (exists(param[1], &pDb) == 0)
{
fprintf (stderr, "ERROR: Product exists yetn");
}
else
{
char *zSQL = sqlite3_mprintf("INSERT INTO 'table' VALUES ('%q', '0')", param[1]);
error = sqlite3_exec(
pDb, /* An open database */
zSQL, /* SQL to be evaluated */
0, /* Callback function */
NULL, /* 1st argument to callback */
NULL /* Error msg written here */
);
sqlite3_free(zSQL);
if (error == 0) printf("Addedn");
else printf("%i", error);
}
}
else return 1;
return 0;
}
它在sqlite3_prepare_v2
上失败。我希望pDb
上的指针有问题,但我无法修复它(我不喜欢指针 - 对于初学者来说太强了)。当它失败时,调试器堆叠在sqlite3.c中的93396行(*ppStmt = 0; - 它写在它不应该写的地方)。
在 linux x64 上编译:
gcc -std=c99 -Wall -pedantic -Wextra -Werror -DSQLITE_THREADSAFE=0 -ldl -o sqlite main.c sqlite3.c
没有错(如果我复制了错误的括号,请忽略它 - 这不是问题),SQLite 3.7.14.1
对不起我的英语,我来自捷克。
sqlite3_prepare_v2
想要将语句指针写入输出变量,但你没有给它一个指向这个指针变量的指针,而是给它一个NULL
指针。 用:
sqlite3_stmt *pStmt;
sqlite3_prepare_v2(..., &pStmt, ...);
另请注意,标识符应用"double quotes"
或[brackets]
或
`backticks`
但不适用于'single quotes'
,用于文字字符串。