2017-03-03 91 views
0

我有一個簡單的函數來查找Oracle中的一些數據,並返回一個由表中各種數據元素組成的對象。PowerShell函數返回意外的數據

function Get-OracleInfo { 

[OutputType([PSObject])] 
Param( [Parameter(Mandatory=$False)][string]$BindValue, 
[Parameter(Mandatory=$True)][string]$OraclePath, 
[Parameter(Mandatory=$True)][string]$OracledbConnectionString,) 

Begin { 
$Query="select stuff......" 
Add-Type -Path $OraclePath 
} 

PROCESS { 

#get data 
try { 
$connection=New-Object Oracle.ManagedDataAccess.Client.OracleConnection($OracledbConnectionString) 
$connection.Open() 
$OprIDLookupCmd=$connection.CreateCommand() 
$OprIDLookupCmd.CommandText=$Query 

#set bind value to parameter 
$OprIDLookupBindParam = New-Object Oracle.ManagedDataAccess.Client.OracleParameter 
$AccountLookupBindParam.Value = $BindValue 
$AccountLookupCmd.Parameters.Add($AccountLookupBindParam) 
$AccountRdr=$AccountLookupCmd.ExecuteReader() 
if ($AccountRdr.Read()) { 
$accountInfo = New-Object psobject -Property @{'StringVal1'=$AccountRdr.Item("field1") 
'StringVal2'=$AccountRdr.Item("field2") 
'Date1'=[datetime]$AccountRdr.Item("field3")} 

} 
} 
catch 
{ 
Write-Error ("Error in lookup Account - Can't open connection: {0}`n{1}" -f 

$connection.ConnectionString, $_.Exception.ToString()) 
} 
} 

END { 
if ($connection.State -eq 'Open') { $connection.close() } 
return $accountInfo 
} 

它在Oracle中獲取數據就好了,並將表格字段賦值給對象就好了。當在調試中運行它時,查看變量$ accountInfo的值,它將返回一個包含3個屬性的對象,就像預期的一樣。

String1    Date2      String2 
--------   ------------    ----- 
StringVal2  5/11/2016 12:00:00 AM   StringVal2 

但主叫從命令行功能並將其分配給一個變量.....當從函數返回時,它顯示爲具有2個元素的陣列。 $ UserData [1]是返回的對象(表示它顯示具有Stringval1,Stringval2,Date1的3個屬性的對象)。我弄不明白的是爲什麼它以數組的形式返回,並且第一個元素(即$ UserData [0])是一個OracleObject。運行命令

$UserData | Get-Member 

TypeName: Oracle.ManagedDataAccess.Client.OracleParameter 

Name      MemberType Definition                   
----      ---------- ----------                   
Clone      Method  System.Object Clone(), System.Object ICloneable.Clone()       
CreateObjRef    Method  System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)     
Dispose     Method  void Dispose(), void IDisposable.Dispose()           
Equals     Method  bool Equals(System.Object obj)              
GetHashCode    Method  int GetHashCode()                 
GetLifetimeService  Method  System.Object GetLifetimeService()             
GetType     Method  type GetType()                  
InitializeLifetimeService Method  System.Object InitializeLifetimeService()           
ResetDbType    Method  void ResetDbType()                 
ResetOracleDbType   Method  void ResetOracleDbType()               
ToString     Method  string ToString()                 
ArrayBindSize    Property int[] ArrayBindSize {get;set;}              
ArrayBindStatus   Property Oracle.ManagedDataAccess.Client.OracleParameterStatus[] ArrayBindStatus {get;set;} 
CollectionType   Property Oracle.ManagedDataAccess.Client.OracleCollectionType CollectionType {get;set;}  
DbType     Property System.Data.DbType DbType {get;set;}            
Direction     Property System.Data.ParameterDirection Direction {get;set;}        
IsNullable    Property bool IsNullable {get;set;}               
Offset     Property int Offset {get;set;}                
OracleDbType    Property Oracle.ManagedDataAccess.Client.OracleDbType OracleDbType {get;set;}    
OracleDbTypeEx   Property Oracle.ManagedDataAccess.Client.OracleDbType OracleDbTypeEx {get;set;}    
ParameterName    Property string ParameterName {get;set;}             
Precision     Property byte Precision {get;set;}               
Scale      Property byte Scale {get;set;}                
Size      Property int Size {get;set;}                
SourceColumn    Property string SourceColumn {get;set;}              
SourceColumnNullMapping Property bool SourceColumnNullMapping {get;set;}           
SourceVersion    Property System.Data.DataRowVersion SourceVersion {get;set;}        
Status     Property Oracle.ManagedDataAccess.Client.OracleParameterStatus Status {get;set;}   
UdtTypeName    Property string UdtTypeName {get;set;}              
Value      Property System.Object Value {get;set;}              


    TypeName: System.Management.Automation.PSCustomObject 

Name   MemberType Definition         
----   ---------- ----------         
Equals  Method  bool Equals(System.Object obj)    
GetHashCode Method  int GetHashCode()       
GetType  Method  type GetType()        
ToString  Method  string ToString()       
Date1   NoteProperty datetime Date1=5/11/2016 12:00:00 AM 

StringVal2 NoteProperty string StringVal2=String2      
StringVal1 NoteProperty string StringVal1=String1 

希望我的事件和問題的解釋意義時,下面是詳細信息.....我完全狼狽,所以欣賞任何幫助。 謝謝!

回答

2

嘗試拋出上述加法運算的結果:

[void]$AccountLookupCmd.Parameters.Add($AccountLookupBindParam) 
+0

感謝邁克,是沒有的伎倆!我很想理解爲什麼這會起作用..... – Jeff

+0

這是因爲輸出沒有被「捕獲」,所以它被添加到函數的輸出流中。 –

+0

該行爲在[documentation](https://msdn.microsoft.com/en-us/powershell/reference/3.0/microsoft.powershell.core/about/about_return)中進行了解釋。 –