sqlite 调用update 语句时,假如记录不存在,会怎么样?

LyndonZheng 2009-05-20 03:11:29
sqlite 调用update 语句时,假如记录不存在,会怎么样?

是返回一个错误,还是自动添加该记录但全部属性为空?

我现在update一个不存在的记录,他不返回错误,但读又没读到数据
...全文
5201 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanglei5695312 2010-06-07
  • 打赏
  • 举报
回复
replace
zhq527725 2009-11-15
  • 打赏
  • 举报
回复
学习一下。
pengpcz 2009-06-10
  • 打赏
  • 举报
回复
有没有办法查看某条记录是否存在,如表中有字段:RecordID RecordName,如果我想看是否存在RecordName='record_one'的记录是否存在,什么函数或函数组合比较好呢?
LyndonZheng 2009-05-23
  • 打赏
  • 举报
回复
明白了,原来是因为数据库建表时没有指定primary key, 所以replace语句不正常.
问题已解决,谢谢大家
峰白 2009-05-20
  • 打赏
  • 举报
回复
没有错误,也不增加记录,如果你用Execute执行SQL语句的话,通过第二个参数“参数RecordsAffected是操作完成后所影响的行数,”判断影响的行数来判断执行情况,如果为0说明一行都未更新
LyndonZheng 2009-05-20
  • 打赏
  • 举报
回复
另外,我已确定我的INSERT UPDATE 和 select 语句没有错误

因为我通过先INSER 后 UPDATE 的方法是可以正常插入和修改数据的
LyndonZheng 2009-05-20
  • 打赏
  • 举报
回复
用replace好象还是不行,新建时可以,但再调用一次来修改数据时就不行了.
貌似他的知已经存在这个记录时就直接退出,不会做任何操作.
LyndonZheng 2009-05-20
  • 打赏
  • 举报
回复
谢谢大家 我试一试先
hendriclee 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 san_77227487 的回复:]
引用 4 楼 hendriclee 的回复:
是成功的,如果你不放心,可以用replace语句


我主要是想实现这样的功能: 先update, 如果发现不存在的话,就改用insert

但他返回成功的话,我不知道怎么做判断了
[/Quote]

REPLACE语句的用途是,如果记录存在,就UPDATE,如果记录不存在,就INSERT
oyljerry 2009-05-20
  • 打赏
  • 举报
回复
UPDATE \"table0\" SET data = ? WHERE name = \'san\';
LyndonZheng 2009-05-20
  • 打赏
  • 举报
回复
写数据时str_sql 的值为

UPDATE 'table0' SET data = ? WHERE name = 'san';
LyndonZheng 2009-05-20
  • 打赏
  • 举报
回复


//创建并打开文件
MySQLite *sqlite = new MySQLite;
sqlite->sqlite_connect(TEST_FILE);

Sleep(100);

//建立一张表
std::string str_sql = "CREATE TABLE ";
str_sql += TEMP_TABLE;
str_sql += "(name VARCHAR, data blob);";

bool b = sqlite->sqlite_exec(str_sql.c_str());
assert_exp(b == true);

//------------------------------------------------------------------------------------
//写数据

//把一个 sql 语句解析到 stat 结构里去
sqlite3_stmt *stat;
std::string table_name = TEMP_TABLE;
std::string line_name = "san";
str_sql = "UPDATE '" + table_name + "' SET data = ? WHERE name = '" + line_name + "';";


int result = sqlite3_prepare( sqlite->m_db, str_sql.c_str(), -1, &stat, 0 );
assert_exp(result == SQLITE_OK && stat != NULL );

//将结构体转化为二进制字符串流
st_tb tb;
tb.a = 5;
std::string str_binary = ToStringEasyBin(tb);


//开始插入二进制数据
int back = sqlite3_bind_blob( stat, 1, str_binary.c_str(), str_binary.length(), NULL );
//保存到数据库里
result = sqlite3_step( stat );
//释放结构
sqlite3_finalize( stat );

//------------------------------------------------------------------------------------
//读数据

sqlite3_stmt * stat1;
str_sql = "select * from ";
str_sql += TEMP_TABLE;
result = sqlite3_prepare( sqlite->m_db, str_sql.c_str(), -1, &stat1, 0 );
assert_exp(result == SQLITE_OK );

result = sqlite3_step( stat1 );
if (result != SQLITE_ROW)
{
std::cout<< "fail"<<endl;
return 0;
}

const void *content = sqlite3_column_blob( stat1, 1 );
int len = sqlite3_column_bytes( stat1, 1 );

char *src = (char*)content;
std::string desc(src,len);

//将字符串流转化为原结构
st_tb tb1;
ToStructEasyBin(desc,tb1);

//把刚才分配的内容析构掉
sqlite3_finalize( stat1 );

oyljerry 2009-05-20
  • 打赏
  • 举报
回复
Update的sql语句是否正确...
LyndonZheng 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hendriclee 的回复:]
是成功的,如果你不放心,可以用replace语句
[/Quote]

我主要是想实现这样的功能: 先update, 如果发现不存在的话,就改用insert

但他返回成功的话,我不知道怎么做判断了
hendriclee 2009-05-20
  • 打赏
  • 举报
回复
是成功的,如果你不放心,可以用replace语句
LyndonZheng 2009-05-20
  • 打赏
  • 举报
回复
假如不用update,改为insert

后面的读程序是可以将数据读出来的
LyndonZheng 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oyljerry 的回复:]
查看sqlte Update执行的sql语句返回值先看看...
[/Quote]

是0,即SQLITE_OK
oyljerry 2009-05-20
  • 打赏
  • 举报
回复
查看sqlte Update执行的sql语句返回值先看看...

16,547

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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