繁体   English   中英

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

[英]Reuse parameterized (prepared) SQL Query

几年前我编写了一个 ActiveDirectory 日志系统......

我收到了一个问题报告并发现了发生了什么......它们是这样一个 ActiveDirectory 事件中的几个字段,是用户输入,所以我必须验证它们! ——我当然没有……

因此,在第一个用户有了在特定文件夹名称中使用单引号的绝妙主意后,它使我的脚本崩溃了 - 可以轻松注入...

所以我喜欢使用像我在 PHP 和其他人中使用的准备好的语句进行更新。

现在这是一个 Powershell 脚本.. id 喜欢做这样的事情:

$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()

这会正常工作 - 1次。 我的脚本作为服务无限运行,并在while($true)循环中循环。

关于参数的 Powershell 蛤蜊已经设置...

使用“2”个参数调用“AddWithValue”时出现异常:“参数‘@k1’已被定义。”

如何在不关闭数据库连接的情况下重置此“绑定”? id 喜欢让连接保持打开状态,因为在触发事件时脚本更快,无需关闭和打开连接(10+/秒)

示例代码(缩短并未经测试)

##start
function db_prepare(){
    $MySqlConnection = New-Object MySql.Data.MySqlClient.MySqlConnection
    $MySqlConnection.ConnectionString = "server=$MySQLServerName;user id=$Username;password=$Password;database=$MySQLDatenbankName;pooling=false"
    $MySqlConnection.Open()
    $MySqlCommand = New-Object MySql.Data.MySqlClient.MySqlCommand
    $MySqlCommand.Connection = $MySqlConnection
    $MySqlCommand.CommandText = "INSERT INTO `whatever` (col1,col2...) VALUES (@va1,@va2...)"
}
while($true){
    if($MySqlConnection.State -eq 'closed'){ db_prepare() }

    ## do the event reading and data formating stuff
    ## bild some variables to set as sql param values

    $MySQLCommand.Parameters.AddWithValue("@va1",$variable_for_1)
    $MySQLCommand.Parameters.AddWithValue("@va2",$variable_for_2)
    .
    .
    .

    Try{  $MySqlCommand.ExecuteNonQuery() | Out-Null }
    Catch{ <# error handling #> }

}

更改您的逻辑,以便db_prepare()方法初始化一个 MySql 连接和一个带参数的 MySql 命令。 为循环中预先声明的参数名称设置参数值 像这样,

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() 
    # ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM