我正在尝试查看带有Poco库的MySQL表中是否存在行。
这样做的一种方法是:
session << "SELECT COUNT(*) FROM %s WHERE Serial=?",
into(n), // int
tableName, // string
use(serial), now;
然后检查n==0
。
然而,更明确(更快)的方法是
session << "SELECT EXISTS(SELECT * FROM %s WHERE Serial = ?)",
into(n),
tableName,
use(serial), now;
n
的值将为0或1.但是,这会在运行时抛出一个断言异常(!pBinder.isNull()
)。无论n
是int
还是bool
,都会出现这种情况(由于EXISTS
会返回BOOLEAN
,因此会更加充分。)
如果问题出在我的绑定上(因为错误意味着,即使此绑定与我之前完成的其他查询相同),我尝试使用RecordSet
执行此操作,暂时删除所有绑定此测试,然后将其打印到屏幕上。
session << "SELECT EXISTS(SELECT * FROM TestTable WHERE Serial = 'XXX')", now;
RecordSet r(exists);
cout << r;
查询和RecordSet
的构造似乎工作正常,但当我尝试打印到控制台时,会抛出Poco::BadCastException
。
那么,这可以用Poco完成,还是我必须继续使用SELECT COUNT(*)
方法?
答案 0 :(得分:0)
所以,我不会使用Poco,所以我无法对此发表评论。但是,如果您无法直接使用它,请不要诉诸count(*)
,因为这对大型表的操作要慢得多。最糟糕的情况是,您需要以下内容:
select if(exists(select 1 from %s where Serial=?), 1, 0)
或者您希望为true
和false
提供的任何其他价值。