2014-04-18 55 views
1

我将本机C++应用程序从SQLite移植到MySql。 SQLite中,可以使用名为准备语句的参数,如下列之一:MySql C API:是否支持准备语句命名参数?

SELECT * FROM `Table` WHERE `Id` = @Id 

在MySQL文档没有提到这样的功能。相反,MySQL中我们使用未命名的参数,如下列之一:

SELECT * FROM `Table` WHERE `Id` = ? 

它不是查询时很容易出现问题;但是,对于具有10-15个参数的复杂查询,如果您必须更新统计信息,则此方法看起来很糟糕;你必须控制自己,每个未命名的参数处于正确的位置,记住参数数组中的索引是什么问题符号。所以,对我而言,在MySql中不寻常的是不支持命名的预处理语句参数。

在MySql C API中有没有什么方法可以在准备语句中使用命名参数,而不是用问号表示的未命名参数?

回答

0

这个功能没有像我们在SQLite中那样的“官方”支持。但是,可以模拟它。 而不是发送1个命令的:

SELECT * FROM `Table` WHERE `Id` = ? 

它需要发送2个1:

SET @Id = 1 
SELECT * FROM `Table` WHERE `Id` = @Id 
SET @Id = NULL 

当你有查询参数为名称 - 值对(例如,std:unordered_map),它不是一个问题来生成自动创建和清理变量的SQL查询。当然,不是1个查询,你必须发送尽可能多的查询,并且有相同数量的查询来清理变量(如果你需要的话)。如果您在SQL查询中使用变量,那么您也有可能覆盖任何变量。但是,这种方法在复杂查询中仍然可用并且比未命名参数更舒适。