sqlite3_bind_parameter_index返回0?

发布于 2024-11-08 13:06:41 字数 517 浏览 0 评论 0原文

计数返回参数的计数并且很好。然而索引返回 0。 有什么想法吗?

sqlite3 *database;
sqlite3_stmt *updateStmt;
int ID;
const char *sql;

sql = "update User set Name = ? , Dev = ?,ActiveLevel = ? Where _id = ?";


if(sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) != SQLITE_OK)
  NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(database));

NSLog(@"count %d",sqlite3_bind_parameter_count(updateStmt));

NSLog(@"Index %d",sqlite3_bind_parameter_index(updateStmt,"ActiveLevel"));

The count returns a count of the parameters and is good. However the index is returning 0.
Any ideas?

sqlite3 *database;
sqlite3_stmt *updateStmt;
int ID;
const char *sql;

sql = "update User set Name = ? , Dev = ?,ActiveLevel = ? Where _id = ?";


if(sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) != SQLITE_OK)
  NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(database));

NSLog(@"count %d",sqlite3_bind_parameter_count(updateStmt));

NSLog(@"Index %d",sqlite3_bind_parameter_index(updateStmt,"ActiveLevel"));

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

花海 2024-11-15 13:06:41

来自精细手册

int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
返回给定名称的 SQL 参数的索引。

对于参数


后面不跟数字的问号会创建一个参数,其数字比已分配的最大参数编号大 1。
...
:AAAA
冒号后跟标识符名称,用于存放命名参数,其名称:AAAA

强调我的第二部分。

你的 SQL 根本没有任何命名参数,只有普通的旧占位符。参数名称是占位符的名称 (:AAAA),而不是相关列的名称;请记住,您可以在无法自动派生名称的地方使用占位符,因此您必须自己命名它们。

如果您想使用 ActiveLevel 作为命名参数,那么您的 SQL 应如下所示:

update User set Name = ? , Dev = ?, ActiveLevel = :ActiveLevel Where _id = ?

并且您可能希望用命名参数替换其他占位符 (?)为了一致性。

From the fine manual:

int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
Return the index of an SQL parameter given its name.

And for parameters:

?
A question mark that is not followed by a number creates a parameter with a number one greater than the largest parameter number already assigned.
...
:AAAA
A colon followed by an identifier name holds a spot for a named parameter with the name :AAAA.

Emphasis mine in the second section.

Your SQL doesn't have any named parameters at all, you just have plain old placeholders. The parameter name is the name of the placeholder (:AAAA), not the name of the column in question; remember that you can use placeholders in places where no name could be automatically derived so you have to name them yourself.

If you want to use ActiveLevel as a named parameter, then your SQL should look like this:

update User set Name = ? , Dev = ?, ActiveLevel = :ActiveLevel Where _id = ?

And you'd probably want to replace the other placeholders (?) with named parameters for consistency.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文