我编写了一个函数来以不同的方式记录信息,并将该函数放置在模块文件中。一种选择是将数据写入 SQL 数据库。
在我的测试文件中,我创建一个带有连接字符串、命令文本等的 SQL 对象,然后使用 SQL 对象作为参数调用我的函数
WriteLogNew
。
在 SQL 对象中设置 commandtext 属性,然后调用该函数可以正常工作。但是更改函数内的 commandtext 属性会导致以下错误消息:
The property of "CommandText" could not be found for this object
但是从所述函数中获取“CommandText”也会给出正确的结果。
我不知道如何实现这一目标,因此尝试在这里寻求一些帮助。
基本设置如下(我将文件减少到绝对必要的信息)。模块文件看起来像这样
function WriteLogNew{
param(
[string]$output= "",
[string]$filename = "",
[string]$path= "",
[Parameter(Mandatory)][String]$writeLogMethod,
[MySql.Data.MySqlClient.MySqlCommand[]]$sql
)
if($writeLogMethod -eq 'sql'){
$sql.CommandText = "INSERT INTO `log_test` (`logdate`, `logtext`, `lognumber`) VALUES (NOW(), '" + $output + "', '-2');"
$sql.ExecuteNonQuery()
}
}
测试文件如下所示:
$path = $env:USERPROFILE+'\powershell\modules'
Import-Module -Name $path # -Verbose
$argumentsNew = @{
writelogMethod = 'file'
}
#$SQL_Name=$MysqlhashCred01Plaintext.SqlName
$MariaDB_Server = 127.0.0.1
$MariaDB_User = 'user'
$MariaDB_Pwd = 'password'
$MariaDB_Port = 3306
# Timeout parameters
$timeout = 3600
# Connect to the libaray MySQL.Data.dll
try{
Add-Type -Path 'C:\Program Files (x86)\MySQL\MySQL Connector NET 9.0\MySql.Data.dll'
}
catch {
}
# Connection LogDB (MariaDB)
$ConnectionString_MariaDB='server=' + $MariaDB_Server + ';port=' + $MariaDB_Port + ';uid=' + $MariaDB_User + ' ;pwd=' + $MariaDB_Pwd + ';database=ecl;default command timeout=' + $timeout + '; Connection Timeout='+ $timeout
$Connection_MariaDB = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString=$ConnectionString_MariaDB}
$Connection_MariaDB.Open()
# Define a MySQL Command Object for a non-query.
$sql_MariaDB = New-Object MySql.Data.MySqlClient.MySqlCommand
$sql_MariaDB.Connection = $Connection_MariaDB
$output = 'Open the MariaDB connection.'
$sql_MariaDB.CommandText = "INSERT INTO `log_test` (`logdate`, `logtext`, `lognumber`) VALUES (NOW(), '" + $output + "', '-1');"
WriteLogNew @argumentsNew -sql $sql_MariaDB -output $output
# Close the MySQL connection.
$output = 'Close the MariaDB connection.'
$sql_MariaDB.CommandText = "INSERT INTO `log_test` (`logdate`, `logtext`, `lognumber`) VALUES (NOW(), '" + $output + "', '-1');"
WriteLogNew @argumentsNew -sql $sql_MariaDB -output $output
$Connection_MariaDB.Close()
Remove-Module -Name modules
您已将
$sql
参数声明为 MySqlCommand
对象的 array,并且数组没有
CommandText
属性 - 使用循环语句或 ForEach-Object
更新每个单独命令的命令文本数组:
if($writeLogMethod -eq 'sql'){
foreach ($cmd in $sql) {
$cmd.CommandText = "INSERT INTO `log_test` (`logdate`, `logtext`, `lognumber`) VALUES (NOW(), '" + $output + "', '-2');"
$cmd.ExecuteNonQuery()
}
}
如果您只想一次只接受一个命令对象,请将参数声明更改为:
[MySql.Data.MySqlClient.MySqlCommand[]]$sql
到
[MySql.Data.MySqlClient.MySqlCommand]$sql
IIRC: 您遇到的错误是因为 PowerShell 不会自动将 $sql 解释为单个 MySqlCommand 对象,而是解释为 MySqlCommand 对象的数组(如参数声明中所指定)。当您尝试访问 CommandText 等属性(数组类型不存在这些属性)时,这可能会导致问题。
您应该将 [MySql.Data.MySqlClient.MySqlCommand[]]$sql 更改为 [MySql.Data.MySqlClient.MySqlCommand]$sql,这确保 $sql 被视为单个 MySqlCommand 对象。