我目前正在构建一个小工具来构建 MySQL 请求(是的,我知道其中很多已经存在,这不是问题的目标)。
目前,我只是将查询创建为字符串,然后递归连接然后执行,这不是正确的方法。
我知道使用准备好的查询可能会有所帮助,但是出于安全原因需要它们吗?就像在带有 PDO 的 php 中一样?
我的问题是我的递归构建:
- 每个条件
- 每个条件组都带有条件
- 完整的Where元素
- 连接元素
- 叠瓦式查询(并集/相交...)
- 所选字段和使用的函数
- 以字符串形式完成查询,重用之前的每个构建
我的意思是递归(这不是正确的词)
- 我为查询调用 BuildQuery()
- 它为 where 元素调用 BuildQuery()
- 其中元素为 block 调用 BuildQuery()
- block 调用 BuildQuery() 来获取条件
- 条件可以为子对象(带有 IN 条件的 SELECT)调用 BuildQuery()
- 例如)
(所有这些BuildQuery()都来自每个对象实现的公共(public)接口(interface))
这使得准备好的查询的使用变得困难,因为我不知道如何只准备查询的一部分并在最后用准备好的查询组装每个部分。
我正在寻找一种方法来多次构建我准备好的声明。我的第一个想法是让每个 BuildQuery 返回一个带有请求字符串和参数字典的结构。在它们到来时组装它们,并在完成构建时组装该字符串和这些参数作为准备好的查询。这是一个好方法,还是有其他可以更干净的方法?
最佳答案
这个问题并不完全清楚,但由于您询问是否真的有必要使用准备好的语句,所以对我来说,这表明您无法推出自己的 SQL 安全版本。如果这是存储您自己的数据或琐碎数据的私有(private)数据库,那么我想您可以练习滚动自己的数据。如果此数据库将成为生产数据库,可以通过互联网访问或存储个人数据,那么您确实需要遵循最佳安全实践,并且不应该编写自己的安全性,即使您知道自己要做什么正在做。
This article建议 C# 的最佳实践是使用参数化查询。基本上,您将查询写为字符串,然后单独添加参数,下面的示例代码来自文章。我建议您通读这篇文章,以更好地了解 SQL 注入(inject)以及如何防止它。
String query =
"SELECT account_balance FROM user_data WHERE user_name = ?";
try {
OleDbCommand command = new OleDbCommand(query, connection);
command.Parameters.Add(new OleDbParameter("customerName", CustomerName Name.Text));
OleDbDataReader reader = command.ExecuteReader();
// …
} catch (OleDbException se) {
// error handling
}
关于c# - 我们如何递归地组装准备好的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46444215/