我需要编写一个包装器(基于 MySQL Connector / C ++ ),它封装了特定的SQL语句并提供了用户友好的界面,例如: insert() ,更新(),删除(),选择()等。
在MySQL的本机C API中,只需调用" mysql_real_query()" 即可执行每个SQL语句,但现在,在 MySQL Connector中/ C ++ ,事情变得有点困惑。 sql :: Statment 类中有 3 执行函数, sql :: PreparedStatement 6 执行函数>上课:
mysql-connector-c ++ - 1.1.5 \ driver \ mysql_statement.h:
bool execute(const sql::SQLString& sql);
sql::ResultSet* executeQuery(const sql::SQLString& sql);
int executeUpdate(const sql::SQLString& sql);
mysql-connector-c ++ - 1.1.5 \ driver \ mysql_prepared_statement.h,104:
bool execute();
bool execute(const sql::SQLString& sql);
sql::ResultSet executeQuery();
sql::ResultSet executeQuery(const sql::SQLString& sql);
int executeUpdate();
int executeUpdate(const sql::SQLString& sql);
我想知道为什么会有这么多执行功能而不是简单统一的执行功能呢? 并且我应该使用哪个执行函数来指定SQL语句?
注意:我使用 MySQL Connector / C ++ 1.1.5 与 MySQL Server 5.6 作为后端。
答案 0 :(得分:13)
这三个函数中的每一个都有特定的用途,可以从它们的返回类型中猜到。
此功能是最通用的功能。它返回一个布尔值,如果查询返回多个结果,则该值为true;如果查询返回任何内容或更新计数,则返回false。
如果您只想使用一个尽可能通用的功能,这是您想要使用的功能。
如果返回true,则您需要使用ResultSet * getResultSet()
来获得结果
如果它返回false,您将需要使用uint64_t getUpdateCount()
来获取更新的行数。
此函数直接返回ResultSet
,这对SELECT
语句很有用,并假设确实存在要返回的结果集。
相当于拨打execute()
后跟getResultSet()
。
当您知道使用返回行等结果的SQL代码时,您将需要使用此函数。
此函数返回一个整数值,该值对UPDATE
语句有用,并假定有一个更新计数要返回。
相当于调用execute()
后跟getUpdateCount()
,即使由于某种原因,返回类型也不同(int vs uint64_t)。
这是在执行修改数据的SQL语句时使用的函数,您需要知道某些数据是否已被修改。
所以,
为什么有这么多的执行功能而不是简单统一的呢?
统一的实际上是execute
,它可以用来执行任意SQL并适当地处理结果,而当你知道你执行什么类型的查询时,另外两个是方便的包装器。
我应该使用哪个执行函数来指定SQL语句?
在您的情况下,由于您正在编写SQL语言的包装器,因此每个函数都知道它将执行哪种语句,因此使用便捷函数将允许您编写更短的代码。
例如:
insert(), update(), delete() ---> executeUpdate()
select() ---> executeQuery()