无法更改模块文件中紧邻的函数中的 SQL CommandText

问题描述 投票:0回答:2

我编写了一个函数来以不同的方式记录信息,并将该函数放置在模块文件中。一种选择是将数据写入 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 powershell mariadb
2个回答
0
投票

您已将

$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

0
投票

IIRC: 您遇到的错误是因为 PowerShell 不会自动将 $sql 解释为单个 MySqlCommand 对象,而是解释为 MySqlCommand 对象的数组(如参数声明中所指定)。当您尝试访问 CommandText 等属性(数组类型不存在这些属性)时,这可能会导致问题。

您应该将 [MySql.Data.MySqlClient.MySqlCommand[]]$sql 更改为 [MySql.Data.MySqlClient.MySqlCommand]$sql,这确保 $sql 被视为单个 MySqlCommand 对象。

© www.soinside.com 2019 - 2024. All rights reserved.