[英]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.