重用参数化(准备好的)SQL查询

时间:2016-09-13 05:40:44

标签: mysql powershell

几年前我编写了一个ActiveDirectory记录系统...... 它永远不会成为比beta更大的状态,但它仍然在使用......

我报告了一个问题,发现发生了什么...... 在这样的ActiveDirectory事件中,它们是UserInputs的几个filds,所以我要验证它们! - 当然我没有...

所以在第一个用户获得了在特定的foldername中使用单引号的好主意后,它崩溃了我的脚本 - 可以轻松注入......

所以我喜欢使用像PHP和其他人一样使用预处理语句进行更新。

现在这是一个Powershell脚本..我喜欢这样做:

services: 
     twig.extension.text:
         class: Twig_Extensions_Extension_Text
         tags: 
             - { name: twig.extension }

这样可以正常工作 - 1次。 我的脚本作为服务运行无穷无尽,并在$MySQL-OBJ.CommandText = "INSERT INTO `table-name` (i1,i2,i3) VALUES (@k1,@k2,@k3)" $MySQL-OBJ.Parameters.AddWithValue("@k1","value 1") $MySQL-OBJ.Parameters.AddWithValue("@k2","value 2") $MySQL-OBJ.Parameters.AddWithValue("@k3","value 3") $MySQL-OBJ.ExecuteNonQuery() 循环内循环。

关于该参数的Powershell蛤已经设定......

  

使用“2”参数调用“AddWithValue”的异常:“参数   '@ k1'已被定义。“

如何在不关闭数据库连接的情况下重置此“绑定”? id就像保持连接打开一样,因为脚本更快而没有关闭并在事件被触发时打开连接(10+ /秒)

示例代码 (短期而非测试)

while($true)

1 个答案:

答案 0 :(得分:1)

更改逻辑,以便db_prepare()方法使用参数初始化MySql连接和MySql命令。 Set the parameter values循环pre-declared parameter names。像这样,

function db_prepare(){
    # ...
    # Add named parameters
    $MySQLCommand.Parameters.Add("@val1", <datatype>)
    $MySQLCommand.Parameters.Add("@val2", <datatype>)
}
while($true) {
    # ...
    # Set values for the named parameters
    $MySQLCommand.Parameters.SetParameter("@val1", <value>)
    $MySQLCommand.Parameters.SetParameter("@val2", <value>)
    $MySqlCommand.ExecuteNonQuery() 
    # ...
}