2017-03-03 77 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)中进行了解释。 –