sqlite中这样绑定参数行不行的?

LyndonZheng 2010-06-24 01:19:48
sql = "update qin_country set values1 = ?1 where group_name = ?2; update qin_country set values2 = ?3 where group_name = ?2; "; (两个语句,用分号隔开)

.........

int error1,error2,error3;
error1 = sqlite3_bind_text(m_stmt, 1, buff1, strlen(buff1), NULL);
error2 = sqlite3_bind_text(m_stmt, 2, buff2, strlen(buff2), NULL);
error3 = sqlite3_bind_text(m_stmt, 3, buff3, strlen(buff3), NULL);

......


如上的代码,error1和error2都返回正确,但error3返回失败.
我估计是因为第三个参数,是在sql语句中的第二句,但绑定参数只能绑定在第一句的范围.

那请问下,我这个问题可以解决吗? 我想同时绑定参数和运行这个由两个语句组成的sql语句
...全文
777 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwyyxx26 2011-05-16
  • 打赏
  • 举报
回复
马瑞卡
fhmFly63 2010-09-01
  • 打赏
  • 举报
回复
我也遇到了这种情况,我是想将jpg格式图片以二进制形式存入Sqlite,也是在sqlite3_step处遇到问题。不知道楼主解决没有,帮忙解答下
LyndonZheng 2010-07-09
  • 打赏
  • 举报
回复
不好意思 由于临时被交付一件很赶的任务 所以没时间继续测试这个问题

licry01的方法我试过了,的确可以绑定,但sqlite3_step时有错啊,数据库里的数据没有被update

还是不行,原因未知
LyndonZheng 2010-06-24
  • 打赏
  • 举报
回复
非常感谢!!我试试看先
licry01 2010-06-24
  • 打赏
  • 举报
回复
呵呵, 不好意思啊, 还真如你说的, 参数在第二个子句中才出现就不行了, 只能出现在第一个子句中!
不错不错, 学习了, 看来以后我还真得要注意这地方的应用了.
我改成下面的就能运行了:

void my_test()
{
system("del db1.sdb");

int ret;
sqlite3 *pdb = 0;
sqlite3_stmt *stmt = 0;
char *error = 0;
const char *tail = 0;

int index1, index2, index3;
const void *value = "asdfadsfasdfjasdfjaksdfaskjdfakdsfaksfja";

ret = sqlite3_open("db1.sdb", &pdb); //打开数据库,跟打开文本文件一样
if( ret != SQLITE_OK )
return;

ret = sqlite3_exec(pdb, "CREATE TABLE qin_country (GROUP_NAME BLOB PRIMARY KEY, VALUES1 BLOB, VALUES2 BLOB);", 0,0, &error );
if( ret != SQLITE_OK )
return;

ret = sqlite3_exec(pdb, "insert into qin_country values('group_1234','55555','xxxxy');", 0,0, &error );
if( ret != SQLITE_OK )
return;

char *sql = "select @pa1, @pa2, @pa3 where 0>1; update qin_country set values1 = @pa1 where group_name = @pa2; update qin_country set values2 = @pa3 where group_name = @pa2; ";
//char *sql = "update qin_country set values1 = @pa1 where group_name = @pa2; update qin_country set values2 = @pa3 where group_name = @pa2; ";
//char *sql = "update qin_country set values1 = @pa1, values2=@pa3 where group_name = @pa2; ";

ret = sqlite3_prepare(pdb, sql,strlen(sql), &stmt, &tail);
if( ret != SQLITE_OK )
return;

index1 = sqlite3_bind_parameter_index(stmt, "@pa1");
ret = sqlite3_bind_blob(stmt, index1, value, strlen((char*)value), SQLITE_STATIC);
index2 = sqlite3_bind_parameter_index(stmt, "@pa2");
ret = sqlite3_bind_blob(stmt, index2, value, strlen((char*)value), SQLITE_STATIC);
index3 = sqlite3_bind_parameter_index(stmt, "@pa3");
ret = sqlite3_bind_blob(stmt, index3, value, strlen((char*)value), SQLITE_STATIC);

if( ret != SQLITE_OK )
return;

ret = sqlite3_step(stmt);
if( ret != SQLITE_DONE )
return;

sqlite3_close(pdb);
}
LyndonZheng 2010-06-24
  • 打赏
  • 举报
回复
问题就在下面这一句

index3 = sqlite3_bind_parameter_index(stmt, "@pa3");


只要 index3 = 3 就对了
但现在返回的是0
LyndonZheng 2010-06-24
  • 打赏
  • 举报
回复
其中
system("del db1.sqlite3");
和sqlite3_open("db1.sdb", &pdb);
这里没写对应,不过没关系,不管这个
licry01 2010-06-24
  • 打赏
  • 举报
回复
我的sql是下面这样的:
INSERT INTO [objects](project_id, display_name,parent_id,operator,sequence_num)
VALUES(@project_id, @node_name, @pid, @p_uid, (select (ifnull(max(sequence_num),1)+1) from [objects] where parent_id=@pid)) ;
insert into [objects_properties](object_id, prop_id)
select (select object_id from [objects] where parent_id=@pid and display_name=@node_name and project_id=@project_id), prop_id from [properties] ;


我先看看你的代码吧
LyndonZheng 2010-06-24
  • 打赏
  • 举报
回复
以下是我的代码,不行



#include "stdafx.h"
#include "sqlite3.h"
#include <windows.h>

void my_test()
{
system("del db1.sqlite3");

int ret;
sqlite3 *pdb = 0;
sqlite3_stmt *stmt = 0;
char *error = 0;
const char *tail = 0;

int index1, index2, index3;
const void *value = "asdfadsfasdfjasdfjaksdfaskjdfakdsfaksfja";

ret = sqlite3_open("db1.sdb", &pdb); //打开数据库,跟打开文本文件一样
if( ret != SQLITE_OK )
return;

ret = sqlite3_exec(pdb, "CREATE TABLE qin_country (GROUP_NAME BLOB PRIMARY KEY, VALUES1 BLOB, VALUES2 BLOB);", 0,0, &error );
if( ret != SQLITE_OK )
return;

ret = sqlite3_exec(pdb, "insert into qin_country values('group_1234','55555','xxxxy');", 0,0, &error );
if( ret != SQLITE_OK )
return;

char *sql = "update qin_country set values1 = @pa1 where group_name = @pa2; \
update qin_country set values2 = @pa3 where group_name = @pa2; ";

ret = sqlite3_prepare(pdb, sql,strlen(sql), &stmt, &tail);
if( ret != SQLITE_OK )
return;

index1 = sqlite3_bind_parameter_index(stmt, "@pa1");
index2 = sqlite3_bind_parameter_index(stmt, "@pa2");
index3 = sqlite3_bind_parameter_index(stmt, "@pa3");

ret = sqlite3_bind_blob(stmt, index1, value, strlen((char*)value), SQLITE_STATIC);
ret = sqlite3_bind_blob(stmt, index2, value, strlen((char*)value), SQLITE_STATIC);
ret = sqlite3_bind_blob(stmt, index3, value, strlen((char*)value), SQLITE_STATIC);

if( ret != SQLITE_OK )
return;

ret = sqlite3_step(stmt);
if( ret != SQLITE_DONE )
return;

sqlite3_close(pdb);
}

LyndonZheng 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 licry01 的回复:]
引用 5 楼 san_77227487 的回复:
在执行第三个参数的 index3 = sqlite3_bind_parameter_index(m_stmt, "@values3"); 时,返回给index的值是0, 0是错误的,应该是3

所以这种方法应该也是不行


我觉得是你第3个参数绑定有问题, 我这绑一大堆都没有问题
你把跟第3个绑定操作相关的代码贴上来看看
[/Quote]

你绑一大堆,但sql语句是几条? 我是有两条的,用分号隔开
licry01 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 san_77227487 的回复:]
在执行第三个参数的 index3 = sqlite3_bind_parameter_index(m_stmt, "@values3"); 时,返回给index的值是0, 0是错误的,应该是3

所以这种方法应该也是不行
[/Quote]

我觉得是你第3个参数绑定有问题, 我这绑一大堆都没有问题
你把跟第3个绑定操作相关的代码贴上来看看

LyndonZheng 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 licry01 的回复:]
我试了下,是可以的啊
你是不是绑定参数前忘记了调用sqlite3_prepare(.......................) ?????
要不你用的就是sqlite3_exec

我是下面这样的逻辑:
1.sqlite3_prepare
2.绑定各种参数
3.sqlite3_step
4.sqlite3_finalize
[/Quote]

那就奇怪了 我也是这样的逻辑啊

可以把你全部的代码贴上来么?

我也把代码精简下提出来等下贴出来给大家看看
licry01 2010-06-24
  • 打赏
  • 举报
回复
我试了下,是可以的啊
你是不是绑定参数前忘记了调用sqlite3_prepare(.......................) ?????
要不你用的就是sqlite3_exec

我是下面这样的逻辑:
1.sqlite3_prepare
2.绑定各种参数
3.sqlite3_step
4.sqlite3_finalize
LyndonZheng 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 licry01 的回复:]
试试不用"?" 方式的绑定, 比如

sql = "update qin_country set values1 = @values1 where group_name = @values2; update qin_country set values2 = @values3 where group_name = @values2; ";

第一步:
index = sqlite3_bi……
[/Quote]

在执行第三个参数的 index3 = sqlite3_bind_parameter_index(m_stmt, "@values3"); 时,返回给index的值是0, 0是错误的,应该是3

所以这种方法应该也是不行
licry01 2010-06-24
  • 打赏
  • 举报
回复
试试不用"?" 方式的绑定, 比如

sql = "update qin_country set values1 = @values1 where group_name = @values2; update qin_country set values2 = @values3 where group_name = @values2; ";

第一步:
index = sqlite3_bind_parameter_index(m_stmt, "@values1");
第二步:
error1 = sqlite3_bind_text(m_stmt, index, buff1, strlen(buff1), NULL);

LyndonZheng 2010-06-24
  • 打赏
  • 举报
回复
另外,虽然这两条语句是可以合并成一条语句. 但这只是一个测试例子, 我想做的是可以同时运行多条语句的功能
LyndonZheng 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 stonewater 的回复:]
获取下错误信息看看是什么错误
[/Quote]
返回错误SQLITE_RANGE
它在sqlite3.h中是这样定义的
#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */
stonewater 2010-06-24
  • 打赏
  • 举报
回复
获取下错误信息看看是什么错误

4,018

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧