传递给Function时,OleDbConnection变为System.Object []

时间:2013-11-20 20:05:40

标签: excel powershell oledb

我有一个PowerShell脚本,可以使用OLEDB从Excel文件中读取。我做了一个功能,根据一些参数建立连接,这很好。它创建System.Data.OleDb.OleDbConnection连接,然后将其传递给其他函数以获取有关工作表(工作表名称,列名称)的其他信息。

这些函数都运行良好,直到我将连接对象传递给实际查询电子表格中主要工作表的函数。在调用该函数之前,我可以使用GetType()方法验证连接对象是否仍是System.Data.OleDb.OleDbConnection对象。但是在函数内部,它突然变成System.Object[],在我的函数完成任何工作之前。

因此,当我尝试将连接分配给新的OleDbCommand对象时,收到错误:

  

异常设置“连接”:“无法将类型为”System.Object []“的”System.Object []“值转换为”System.D“   ata.OleDb.OleDbConnection “”   在D:\ Scripts \ AdvancementSpreadsheetImport.ps1:130 char:18   + $命令。 <<<<连接= $连接       + CategoryInfo:InvalidOperation:(:) [],RuntimeException       + FullyQualifiedErrorId:PropertyAssignmentException

将代码放在功能块之外并将其放在脚本的主体中,一切正常。

知道是什么给出了什么?

创建连接:

Function connectToSheet($sheetPath) {
    try {
        #Construct the data source
        $provider = "Provider=Microsoft.ACE.OLEDB.12.0" #Microsoft.Jet.OLEDB.4.0"
        $dataSource = "Data Source=`"$sheetPath`""
        $extend = 'Extended Properties="Excel 12.0 Xml;HDR=YES;"'
        $connection = New-Object System.Data.OleDb.OleDbConnection("$provider;$dataSource;$extend;")
        $connection.Open()
        log("Connection to $sheetPath open")
        return $connection
    }
    catch {handleError("Error opening OLE connection to the spreadsheet $sheetPath.")}
}

违规功能:

Function constructIndexFile($connection, $sheetName, $outputPath, $outputFileName) {
    log("Connection info: $($connection.GetType())") #You can see that the connection object's type has changed at this point
    try {
        $query = "select [col1], [col2] from [$sheetName] where [col1] <> `"`""
        $command = New-Object System.Data.OleDb.OleDbCommand($query)

下一行会触发错误。

        $command.Connection = $connection 
        $DataReader = $command.ExecuteReader()
        $indexFileStream = [System.IO.StreamWriter] "$outputFileName"
        While ($DataReader.read()) {
            ##Do stuff to construct my index file
        }
        $indexFileStream.close()
        log("Created index file $outputFileName")
    }
    catch {handleError("Error constructing the index file")}
}

1 个答案:

答案 0 :(得分:3)

PowerShell不使用括号来调用函数;相反,在用空格分隔的函数名之后传递参数。因此,而不是

function_name(param[, ...])

function_name param [...]