您更喜欢使用哪种方法创建动态SQL查询? 格式化或流式传输? 它只是偏好还是有任何理由比其他更好?或者你使用的任何特殊库。

编辑: 请回答c ++。

有帮助吗?

解决方案 3

有一些名为 SOCI - C ++数据库访问库的C ++文件

其他提示

始终使用“准备”将有一个与prepareStatement等效的函数,但确切的函数名称将取决于您的数据库和驱动程序组合。

预执行语句(String)的优点很多: -

解析语句并且访问计划仅在“准备”时确定一次。声明被执行。根据您运行语句的次数,这可以 导致更好的表现。

传递它时,您不必担心字符串数据中的特殊字符 的SetString()。在execute(String)中,数据中的任何单引号或分号都将导致解析错误。

更糟糕的是这是“sql注入”的方式。攻击工作。如果字符串类似于来自cust_table的“x”;从cust_table中删除;选择“作为数据输入,它可能导致删除语句被解析和执行。

处理数字效率更高。 setInt调用取整数值,就像必须转换为字符的等效SQL字符串一样,然后DBMS必须将其转换回整数。

可读性。您编写一个带有几个问号的SQL语句,其中变量相对容易阅读,而不是精神分析和分析一系列字符串连接将为转义引号等额外的噪音。

然而,有几种情况下execute(String)实际上更好。

您的密钥分布非常不均匀。例如。如果您的95%的客户居住在美国,并且您想列出居住在加拿大的4%的客户,那么“where country =?”通常会导致表空间扫描,而“where country ='CA'”你有机会使用索引。

另一种情况是用户可以输入或省略多个搜索条件。为您提供的条件构建SQL字符串要好得多,而不是构建一个复杂的查询来处理输入条件的所有可能的排列。

在Java中,您应该使用 PreparedStatement

PreparedStatement statement = connection.prepareStatement("SELECT * FROM Table WHERE ID = ?");
statement.setInt(1, 17);
ResultSet resultSet = statement.executeQuery();

当使用预处理语句时,我发现使用C ++流是编写查询的最佳方式:

std::ostringstream sql;
sql << "exec loadStuff(" << param1 << ", " << param2 << ")";

不必担心参数的类型和字符串的长度很棒!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top