我正在编写一个预期执行以下操作的脚本:
- 连接到 Oracle DB 并运行主查询以提取原始数据。- 已经作为单元测试工作
- 将原始数据导入 Microsoft access 数据库模板 (.mdb) - 像单元测试一样工作,但在与脚本 1 集成时遇到错误。
- 连接到 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
提前致谢!