0

これは私が使おうとしている方法です:

NSString *orario = [NSString new];
int idmed = 0;
fileMgr = [NSFileManager defaultManager];
sqlite3_stmt *stmt=nil;
sqlite3_stmt *stmt1=nil;
sqlite3_stmt *stmt2=nil;
sqlite3 *dbase;
NSString *database = [self.GetDocumentDirectory stringByAppendingPathComponent:@"med.sqlite"];
sqlite3_open([database UTF8String], &dbase);
const char *sql = "delete from orari where date(orario) <= date('now','-2 day','localtime')";
sqlite3_prepare_v2(dbase, sql, -1, &stmt, NULL);
sqlite3_step(stmt);
const char *sql1 = "select orario,idmedicina from orari where date(orario)=date('now','localtime') and forever = 1";
const char *sql2 = "insert into orari (orario,idmedicina,presa,forever) values (datetime('?','+1 day'),?,0,1)";
sqlite3_prepare_v2(dbase, sql1, -1, &stmt1, NULL);

while(sqlite3_step(stmt1) == SQLITE_ROW) {
    orario = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt1, 0)];
    idmed = [[NSNumber numberWithInt:(int)sqlite3_column_int(stmt1, 1)] intValue];
    sqlite3_prepare_v2(dbase, sql2, -1, &stmt2, NULL);
    sqlite3_bind_text(stmt2, 1, [orario UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_int(stmt2, 2, idmed);
    sqlite3_step(stmt2);
}
sqlite3_close(dbase);

3つのクエリは正しいように見えますが、最後のクエリでは行が挿入されません。2番目の行は1行になるので、最後の行は機能するはずです(直接使用した場合は機能します)。何が間違っていると思いますか?

4

2 に答える 2

1

の周りに引用符があります?。これは、文字通りの疑問符文字を日時として解析しようとします。?パラメータを表す場合は、引用符で囲まないでください。

const char *sql2 = "... VALUES (datetime(?, '+1 day'), ?, 0, 1)";
                                         ^
于 2012-07-14T09:24:47.740 に答える
1

ここにあなたのコードで:

const char *sql2 = "insert into orari (orario,idmedicina,presa,forever) values (datetime('?','+1 day'),?,0,1)";

あなたはあなたの周りに引用符を置きます?(ここでvalues (datetime('?'それをに変更すると言いますvalues (datetime(?)。結果のコードは次のようになります。

const char *sql2 = "insert into orari (orario,idmedicina,presa,forever) values (datetime(?,'+1 day'),?,0,1)";
于 2012-07-14T09:27:13.043 に答える