C++ sqlite语句查询表格是不是存在
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ sqlite语句查询表格是不是存在相关的知识,希望对你有一定的参考价值。
在sqlite administrator中输入:
select count(*) from sqlite_master where type = 'table' and name = 'systemdictionary'
可以得到正确的结果,返回1,但是在c++中通过语句
string tablename = systemdictionary;
string strSql = "select count(*) from sqlite_master where type = 'table' and name = '" + tablename + "'";
int nRes = sqlite3_exec(pepsdbase, strSql.c_str(), 0, 0, &cErrMsg);
每次得到的结果都是0,
请问这个语句哪儿有问题? 多谢了!!
sqlite3_exec返回 0 表示 strSql 查询语句执行成功了,至于查询到的结果,应该使用回调函数进行解析,即给 sqlite3_exec 填入一个回调函数:
int iCount;int nRes = sqlite3_exec(pepsdbase, strSql.c_str(), CB_sqlite_count, &iCount,NULL);
if (nRes == SQLITE_OK)
return iCount; /* 如果iCount = 0,则无此表, 若为1 则有 */
回调函数参考写法:
static int CB_sqlite_count( void *data, int argc, char **argv, char **pszColName)for (int i = 0; i < argc; i++)
*((int *)data) = atoi(argv[i]);
return 0;
注意一点:
在C++中,推荐使用外部函数作为 sqlite3_exec 的回调函数使用(因为C++中,日常接触的Sqlit3为c语言库),其次使用类里面的静态成员做回调函数(这样会有一些局限)
参考技术A 这句话应该怎么写,才表示把表名“systemdictionary”赋值给string型变量tablename。string tablename = "systemdictionary";
按你的写法,是表示把string型变量systemdictionary表示的值赋值给string型变量tablename。两句话意义完全不同的。请细心。本回答被提问者和网友采纳
“ContentType 匹配查询不存在” - 仅在 SQLite 上,而不是 MySQL
【中文标题】“ContentType 匹配查询不存在” - 仅在 SQLite 上,而不是 MySQL【英文标题】:"ContentType matching Query does not exist" - only on SQLite, not MySQL 【发布时间】:2015-05-25 10:23:47 【问题描述】:我在 Django 测试框架的运行方式上遇到了一个奇怪的错误。
使用 SQLite 数据库后端时,所有测试都崩溃并出现以下错误:
File "[]/core/tests/test_admin.py", line 91, in setUpSomething
content_type = ContentType.objects.get(app_label='core', model='SomeModel')
File "[]/lib/python2.7/site-packages/django/db/models/manager.py", line 151, in get
return self.get_queryset().get(*args, **kwargs)
File "[]/lib/python2.7/site-packages/django/db/models/query.py", line 310, in get
self.model._meta.object_name)
DoesNotExist: ContentType matching query does not exist.
但是,相同的代码在 MySQL 后端下执行得很好。
显然 Django 应该使这些函数与所使用的后端无关?
【问题讨论】:
这个答案可能会有所帮助:***.com/a/17614700/2011147 我已经测试过这种方法,但它不起作用..可能是 Django TestCase 的一些事务特性? 这里有同样的问题:代码适用于 MySql,但不适用于 SQLite 测试数据库。我假设syncdb
的某个版本被用于设置数据库,并且应该更新所有 ContentTypes 模型实例,但显然不是。将进一步调查。
【参考方案1】:
我遇到了同样的问题,我不知道我的解决方案是否会有所帮助,但它解决了我的问题,所以就这样吧。
在我的应用程序代码中,我尝试通过以下方式查询 ContentType
实例:
email = ContentType.objects.get(app_label="users", model="EmailAddress")
这在我们实际的 MySQL 数据库中运行良好,但在 SQLite 测试数据库下测试失败。但是,如果我将模型定义切换为小写,它在两个地方都有效:
email = ContentType.objects.get(app_label="users", model="emailaddress")
我的猜测是这可能与default collation in MySQL of case-insensitivity 有关,所以如果我区分大小写比较,第一个查询应该不起作用。
确实,当我查看我的数据库时,django_content_type
表中的所有 model
标签都是小写的,并且 SQLite 关心(默认情况下)大小写,所以我在测试中的查询确实失败了。
【讨论】:
以上是关于C++ sqlite语句查询表格是不是存在的主要内容,如果未能解决你的问题,请参考以下文章
SQLITE检查表users是不是存在的sql语句,如果不存在则创建表users