我们如何递归地组装一个准备好的语句

时间:2017-09-27 09:27:30

标签: c# mysql prepared-statement

我目前正在构建一个构建MySQL请求的小工具,(是的,我知道其中很多已经存在,这不是问题的目标)。

目前我只是将我的查询创建为一个字符串,我以递归方式连接,然后执行这不是正确的方法。

我知道使用准备好的Query可能会有所帮助,但出于安全原因需要它们,就像它们在php中使用PDO一样吗?

我的问题是我的recursif构建版本:

  1. 每个条件
  2. 每个有条件的条件
  3. 完整的Where元素
  4. 加入元素
  5. Imbricated query(union / intersect ...)
  6. 选定的字段&使用的功能
  7. 完成查询作为重用每个以前版本的字符串
  8. 我的意思是递归(这不是正确的词)

    • 我为我的查询调用BuildQuery()
    • 它为element
    • 调用BuildQuery()
    • 其中element为blocs调用BuildQuerry()
    • blocs调用BuildQuerry()for Condition
    • 条件可以为子对象(具有IN条件的SELECT
    • )调用BuildQuerry()
    • 例如)

    (所有这些BuildQuerry()都来自每个对象实现的通用接口)

    这使得使用准备好的查询变得困难,因为我没有看到我如何准备我的查询的一部分,并在最后用准备好的查询汇总每个部分。

    我正在寻找一种方法来多次构建我准备好的语句。我的第一个想法是让每个BuildQuery返回一个带有请求字符串的结构和一个参数字典。在它们到来时以及在完成构建组装此字符串并将这些参数作为准备好的查询时组装它们。这是一个很好的方法吗,还是有其他更清洁的东西?

1 个答案:

答案 0 :(得分:0)

问题并不完全清楚,但是由于您在询问是否确实需要使用预准备语句,因此它向我建议您无法使用自己的SQL安全版本。如果这是一个存储您自己的数据或琐碎数据的私人数据库,那么我猜您可以练习自己的数据。如果这个数据库将成为生产数据库,可以通过互联网访问,或存储个人数据,那么你真的需要遵循最佳安全实践,不应该写自己的安全性,即使你知道你是什么正在做

This article建议C#最佳做法是使用参数化查询。基本上你把查询写成一个字符串,但然后单独添加参数,下面的示例代码来自文章。我建议你仔细阅读这篇文章,以便更好地理解SQL注入以及如何防止它。

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
 }