【问题标题】:How to use IN clause with SQLParameters?如何在 SQLParameters 中使用 IN 子句?
【发布时间】:2021-03-26 18:46:42
【问题描述】:

如果我提供一个 ComputerName 值的实例,我的函数就可以完美运行。我的问题是如何修改 SQL 查询以便它可以接受一个数组?我不相信创建一个循环来多次查询数据库是一种正确的方法。例如,我认为这个带有 IN 子句的 SQL 查询是一种正确的方法:

SELECT * FROM Customers WHERE Country IN ('Germany', 'France', 'UK');

换句话说,我希望能够调用这个函数来提供多个 ComputerName 值。像这样:

PS C:\>Get-Query_Database_Query1('comp01','comp02')

我需要帮助的代码。请使用 SQLParameters 构建 SQL 查询:

function Get-Query_Database_Query1
{
    [OutputType([System.Data.DataTable])]
    param
    (
        [Parameter(Mandatory = $false,
                   Position = 1)]
        [string]$PCname
    )
    
    #Database Query
    $QueryString = "select * from [Table1] where [ComputerName]=@PCname"
        
    #Database Connection String
    $ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Open\Database4.mdb;Password=;User ID=Admin'
    
    $command = New-Object System.Data.OleDb.OleDbCommand ($QueryString, $ConnectionString)
        $Command.Parameters.Add("@PCname", [System.Data.OleDb.OleDbType]::VarChar, 50).Value = $PCname;
    $adapter = New-Object System.Data.OleDb.OleDbDataAdapter ($command)
    
    #Load the Dataset
    $dataset = New-Object System.Data.DataSet
    [void]$adapter.Fill($dataset)
    
    #Return the Dataset
    return @( ,$dataset.Tables[0])
}

【问题讨论】:

  • 首先,你的参数$PCName应该改为[string[]]
  • 我对如何使用 SQLParameters 添加数组更感兴趣
  • 请符合标准参数命名。 PCName 应该是 ComputerName

标签: sql powershell oledb oledbcommand


【解决方案1】:

您需要做一些字符串操作,同时使用 SQL 查询更容易使用Here Strings

如果您要将多台计算机传递给您的函数,参数$PCname 必须能够接受字符串数组,因此将[string] 更改为[string[]]

查看此代码,看看它是否适合您:

function Get-Query_Database_Query1
{
    [OutputType([System.Data.DataTable])]
    param
    (
        [Parameter(Mandatory = $false,
                   Position = 1)]
        [string[]]$PCname
    )
    
    #Database Query
    $QueryString = @"
    SELECT * 
    FROM [Table1]
    WHERE [ComputerName] IN ('{0}')
"@ -f ($PCname -join "','")

$QueryString
}

Get-Query_Database_Query1 -PCname 'computer1','computer2','computer3','computer4'

查询应该是这样的:

PS /home/> Get-Query_Database_Query1 -PCname 'computer1','computer2','computer3','computer4'
    SELECT * 
    FROM [Table1]
    WHERE [ComputerName] IN ('computer1','computer2','computer3','computer4')

【讨论】:

  • 我不能接受这个答案。您的代码对 SQL 注入很有价值。您需要使用 SQLParameters 执行 SQLCommand 来避免它。
  • 大声笑我只是在做你在你的问题中提出的问题。我已经知道这不是一个好习惯:)
猜你喜欢
  • 2018-06-08
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多