1

我正在编写一个预期执行以下操作的脚本:

  1. 连接到 Oracle DB 并运行主查询以提取原始数据。- 已经作为单元测试工作
  2. 将原始数据导入 Microsoft access 数据库模板 (.mdb) - 像单元测试一样工作,但在与脚本 1 集成时遇到错误。
  3. 连接到 MS Access 数据,运行过滤(子)查询并将结果导出到单独的 Excel 选项卡中。- 已经作为单元测试工作

*直接在 Oracle 数据库上运行(子)查询是不可行的,因为在 Oracle 数据库(原始数据)上执行的查询大约需要 5 小时,因此原始数据首先导入到 Microsoft 访问进行处理,然后运行(子)查询。

我已经为每个项目创建了 Powershell 脚本和一个主脚本,它调用并提供每个项目的参数。它们已经过单元测试。

1 - 01.dbquery.ps1[Parameter: NONE; Returns: RAW DATA]

2 - 02.mdbimport.ps1[Parameter: RAW DATA(from 1),MDB FILE Return: NONE]

3 - 03.mdb 导出.ps1[Parameter: EXCEL FILE, MDB FILE; Return: NONE]

主脚本.ps1

但是,在集成脚本 1 和 2 时,我收到错误System.Management.Automation.ParameterBindingException: A positional parameter cannot be found that accepts argument 'System.Data.DataRow'. 请注意,脚本 1 从 Oracle DB 上的查询结果返回 System.Data.Datatable 值,我试图弄清楚为什么脚本 2 似乎不接受这个值. 我也尝试过System.data.datarow在参数声明中说明类型,但仍然无济于事,因为我收到了错误

Cannot process argument transformation on parameter 'RawData'. Cannot convert the "System.Data.DataRow System.Data.DataRow System.Data.DataRow System.Data.DataRow System.Data.DataRow System.Data.DataRow" value of type "System.String" to type "System.Data.DataRow".

以下是每个脚本的代码片段

主脚本.ps1

## Setup reusable variables (e.g. MDB, excel templates)
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$Date=(get-date).tostring('MMddyyy')
$MdbFile =  $scriptPath+"\Pts on Spans Analysis "+$date+".mdb" 
$ExcelFile = $scriptPath+'\Pts on Spans Action '+$date+'.xls'

## 01. Connect to Oracle DB and run main query for PS raw data
write("**Starting Oracle database query and storing results... -- "+(get-date))
$01dbquery = $scriptPath+"\01dbquery.ps1"
$01ret = Invoke-Expression "& `"$01dbquery`""
write("**Finished querying Oracle DB. -- "+(get-date)); write-host

## 02. Import raw data to MDB template (Microsoft access) -- ImportedPtsonSpans
write("**Starting import of PS raw data to MDB... -- "+(get-date))
$02mdbimport = $scriptPath+"\02mdbimport.ps1"
Invoke-Expression "& `"$02mdbimport`" -RawData $01ret -MdbFile `"$MdbFile`""
write("**Finished import of PS raw data. -- "+(get-date)); write-host

## 03. Process MS Access data and export into excel
write("**Starting export of processed PS data into Excel... -- "+(get-date))
$03mdbexport = $scriptPath+"\03mdbexport.ps1"
Invoke-Expression "& `"$03mdbexport`" -ExtractName `"$ExcelFile`" -MdbFile `"$MdbFile`""
write("**Finished data export. Pts and Span Extract Completed -- "+(get-date)); write-host

01dbquery.ps1

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition    
function Get-DataTable
{
    Param(
    [Parameter(Mandatory=$true)]
    [System.Data.OracleClient.OracleConnection]$conn,
    [Parameter(Mandatory=$true)]
    [string]$sql
    )
    $cmd = New-Object System.Data.OracleClient.OracleCommand($sql,$conn)
    $da = New-Object System.Data.OracleClient.OracleDataAdapter($cmd)
    $dt = New-Object System.Data.DataTable
    [void]$da.Fill($dt)
    return ,$dt
}

## Initiate database credential variables
<more codes here>

## Setup database connection
<more codes here>

## Perform database queries and store results
$QueryPath = $scriptPath+"\queries\main\Pts Span Qry.txt"
$Query = get-content $QueryPath | out-string

# *** Entry Point to Script ***
$RawData = Get-DataTable $conn $Query ; $RawData

02mdbimport.ps1

param
(
    [Parameter(Mandatory=$true)]$RawData,
    [Parameter(Mandatory=$true)]$MdbFile
)
$ErrorActionPreference = 'Stop'

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition    

Function Connect-Database($MdbFile, $Tables)
{
  <codes>
} #End Update-Records

Function Update-ImportedPtsonSpans
{
 <codes>
} #End Update-ImportedPtsonSpans

# *** Entry Point to Script ***
## Perform import of raw data into Microsoft Access Database (MDB)
$Tables = "ImportedPtsonSpans"
# Test if raw data is passed
write-host Start Test raw data and MdbFile
$RawData
$MdbFile
write-host End Test raw data and MdbFile
#
Connect-DataBase -MdbFile $MdbFile -tables $Tables

03mdbexport.ps1

param
(
    [Parameter(Mandatory=$true)]$ExtractName,
    [Parameter(Mandatory=$true)]$MdbFile
)
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
Function Export-Data($Queries,$MdbFile,$ExtractName)
{
    <codes>        }
} #End Export-Data

Function Export-To-Excel($ExtractName,$QueryName,$CurResult)
{
    <codes>    } # End Export-To-Excel

# *** Entry Point to Script ***
$QueryPath = $scriptPath+"\queries\*.txt"
$Queries = Get-ChildItem $QueryPath
Export-Data -Queries $Queries -MdbFile $MdbFile -ExtractName $ExtractName

提前致谢!

4

0 回答 0