2017-03-03 4 views
0

Ich habe eine einfache Funktion, um einige Daten in Oracle nachzuschlagen und ein Objekt, das aus den verschiedenen Datenelementen besteht, aus der Tabelle zurückzugeben.PowerShell Funktion, die unerwartete Daten zurückgibt

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 
} 

es bekommt die Daten nur gut in Oracle, und ordnet die Tabellenfelder für das Objekt nur in Ordnung. Wenn Sie dies im Debug ausführen, sehen Sie sich die Werte für die Variable $ accountInfo an und geben genau wie erwartet ein Objekt mit 3 Eigenschaften zurück.

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

aber wenn die Funktion von der Kommandozeile aufrufen und auf eine variable Zuordnung ..... auf von der Funktion zurückkehrt, zeigt es als ein Array mit 2 Elementen.

$UserData=Get-OracleInfo -BindValue $account -OraclePath $OraclePath -OracledbConnectionString $OracledbConnectionString 

$ Userdata [1] ist das zurückgegebene Objekt (was bedeutet es, das Objekt mit den drei Eigenschaften von Stringval1 zeigt, Stringval2, Date1). Das Ding, das ich nicht herausfinden kann, ist, warum es als ein Array zurückkehrt, und das erste Element (d. H. $ UserData [0]) ist ein OracleObject. Im Folgenden sind die Details, wenn Sie den Befehl ausführen

$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 

Hoffentlich meine Erklärung der Ereignisse und das Problem Sinn machen ..... bin ich völlig verblüfft, so jede Hilfe zu schätzen wissen. Danke!

Antwort

2

Versuchen Sie das Ergebnis der Additionsoperation werfen:

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

Dank Mike, dass der Trick! Ich würde gerne verstehen, warum das funktioniert. – Jeff

+0

Es ist, weil diese Ausgabe nicht "erfasst" wurde, so dass es zum Ausgabestrom der Funktion hinzugefügt wurde. –

+0

Das Verhalten wird in der [Dokumentation] (https://msdn.microsoft.com/en-us/powershell/reference/3.0/microsoft.powershell.core/about/about_return) erläutert. –

Verwandte Themen