是返回一个错误,还是自动添加该记录但全部属性为空?
我现在update一个不存在的记录,他不返回错误,但读又没读到数据
18 个解决方案
#1
查看sqlte Update执行的sql语句返回值先看看...
#2
是0,即SQLITE_OK
#3
假如不用update,改为insert
后面的读程序是可以将数据读出来的
后面的读程序是可以将数据读出来的
#4
是成功的,如果你不放心,可以用replace语句
#5
我主要是想实现这样的功能: 先update, 如果发现不存在的话,就改用insert
但他返回成功的话,我不知道怎么做判断了
#6
Update的sql语句是否正确...
#7
//创建并打开文件
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 );
#8
写数据时str_sql 的值为
UPDATE 'table0' SET data = ? WHERE name = 'san';
UPDATE 'table0' SET data = ? WHERE name = 'san';
#9
UPDATE \"table0\" SET data = ? WHERE name = \'san\';
#10
REPLACE语句的用途是,如果记录存在,就UPDATE,如果记录不存在,就INSERT
#11
谢谢大家 我试一试先
#12
用replace好象还是不行,新建时可以,但再调用一次来修改数据时就不行了.
貌似他的知已经存在这个记录时就直接退出,不会做任何操作.
貌似他的知已经存在这个记录时就直接退出,不会做任何操作.
#13
另外,我已确定我的INSERT UPDATE 和 select 语句没有错误
因为我通过先INSER 后 UPDATE 的方法是可以正常插入和修改数据的
因为我通过先INSER 后 UPDATE 的方法是可以正常插入和修改数据的
#14
没有错误,也不增加记录,如果你用Execute执行SQL语句的话,通过第二个参数“参数RecordsAffected是操作完成后所影响的行数,”判断影响的行数来判断执行情况,如果为0说明一行都未更新
#15
明白了,原来是因为数据库建表时没有指定primary key, 所以replace语句不正常.
问题已解决,谢谢大家
问题已解决,谢谢大家
#16
有没有办法查看某条记录是否存在,如表中有字段:RecordID RecordName,如果我想看是否存在RecordName='record_one'的记录是否存在,什么函数或函数组合比较好呢?
#17
学习一下。
#18
replace
#1
查看sqlte Update执行的sql语句返回值先看看...
#2
是0,即SQLITE_OK
#3
假如不用update,改为insert
后面的读程序是可以将数据读出来的
后面的读程序是可以将数据读出来的
#4
是成功的,如果你不放心,可以用replace语句
#5
我主要是想实现这样的功能: 先update, 如果发现不存在的话,就改用insert
但他返回成功的话,我不知道怎么做判断了
#6
Update的sql语句是否正确...
#7
//创建并打开文件
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 );
#8
写数据时str_sql 的值为
UPDATE 'table0' SET data = ? WHERE name = 'san';
UPDATE 'table0' SET data = ? WHERE name = 'san';
#9
UPDATE \"table0\" SET data = ? WHERE name = \'san\';
#10
REPLACE语句的用途是,如果记录存在,就UPDATE,如果记录不存在,就INSERT
#11
谢谢大家 我试一试先
#12
用replace好象还是不行,新建时可以,但再调用一次来修改数据时就不行了.
貌似他的知已经存在这个记录时就直接退出,不会做任何操作.
貌似他的知已经存在这个记录时就直接退出,不会做任何操作.
#13
另外,我已确定我的INSERT UPDATE 和 select 语句没有错误
因为我通过先INSER 后 UPDATE 的方法是可以正常插入和修改数据的
因为我通过先INSER 后 UPDATE 的方法是可以正常插入和修改数据的
#14
没有错误,也不增加记录,如果你用Execute执行SQL语句的话,通过第二个参数“参数RecordsAffected是操作完成后所影响的行数,”判断影响的行数来判断执行情况,如果为0说明一行都未更新
#15
明白了,原来是因为数据库建表时没有指定primary key, 所以replace语句不正常.
问题已解决,谢谢大家
问题已解决,谢谢大家
#16
有没有办法查看某条记录是否存在,如表中有字段:RecordID RecordName,如果我想看是否存在RecordName='record_one'的记录是否存在,什么函数或函数组合比较好呢?
#17
学习一下。
#18
replace