sqlite3_step(statement) == SQLITE_DONE 语句不返回是 [英] sqlite3_step(statement) == SQLITE_DONE statement not return yes

查看:84
本文介绍了sqlite3_step(statement) == SQLITE_DONE 语句不返回是的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所有时间都没有返回.

-(BOOL)updateProductTable:(NSString *)productid column_shop_Product_quantity:(NSString *) productquantity{
    NSLog(@"%@",productid);
    NSLog(@"%@",productquantity);

    const char *dbpath = [databasepath UTF8String];
    if (sqlite3_open(dbpath, &database) == SQLITE_OK)
    {
        NSString *updateSQL = [NSString stringWithFormat:@"UPDATE ShopProduct set column_shop_Product_quantity=%@ WHERE column_shop_Product_id=%@",productquantity,productid];
        NSLog(@"%@",updateSQL);

        const char *update_stmt = [updateSQL UTF8String];
        if (sqlite3_prepare_v2(database, update_stmt, -1, &statement, nil) == SQLITE_OK)
        {
            if (sqlite3_step(statement) == SQLITE_DONE)
            {
                sqlite3_reset(statement);

                return YES;
            }   
            else {
                return NO;
            }

            sqlite3_finalize(statement);
        }
    }

    sqlite3_close(database);
    return NO;
}

推荐答案

您的代码有几个问题:

  1. 切勿使用 stringWithFormat: 将值绑定到查询.
  2. 大多数情况下您不会关闭数据库.
  3. 在大多数情况下,您不会完成准备好的语句.
  4. 您应该添加更多错误日志来确定任何问题的原因.
  5. 为什么将产品数量作为字符串而不是数字传递?
  6. 你应该使用sqlite3_open_v2.
  7. 对数据库和准备好的语句使用局部变量.

以下是针对所有这些问题更新的代码:

Here is your code updated for all of these issues:

-(BOOL)updateProductTable:(NSString *)productid column_shop_Product_quantity:(NSString *)productquantity {
    NSLog(@"%@",productid);
    NSLog(@"%@",productquantity);

    BOOL res = NO;

    sqlite3 *database = NULL;
    const char *dbpath = [databasepath UTF8String];
    if (sqlite3_open_v2(dbpath, &database, SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK)
    {
        const char *updateSQL = "UPDATE ShopProduct set column_shop_Product_quantity=? WHERE column_shop_Product_id=?";
        sqlite3_stmt *statement = NULL;
        if (sqlite3_prepare_v2(database, updateSQL, -1, &statement, NULL) == SQLITE_OK)
        {
            sqlite3_bind_int(statement, 0, [productquantity intValue]);
            sqlite3_bind_text(statement, 1, [productid UTF8String], -1, SQLITE_TRANSIENT);
            if (sqlite3_step(statement) == SQLITE_DONE) {
                res = YES;
            } else {
                NSLog(@"Unable to update data: %s", sqlite3_errmsg(database));
            }

            sqlite3_finalize(statement);
        } else {
            NSLog(@"Unable to prepare statement: %s", sqlite3_errmsg(database));
        }

        sqlite3_close(database);
    } else {
        NSLog(@"Unable to open database at %@: %s", databasepath, sqlite3_errmsg(database));
    }

    return res;
}

这篇关于sqlite3_step(statement) == SQLITE_DONE 语句不返回是的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆