2017-03-03 3 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=Get-OracleInfo -BindValue $account -OraclePath $OraclePath -OracledbConnectionString $OracledbConnectionString 

$ UserDataを[1](それはStringval1、Stringval2、日付1の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 

のコマンドを実行している場合は、以下の詳細がうまくいけば、イベントや問題の私の説明は、私は完全にflummoxedだ.....意味をなさないので、どのような援助に感謝しています。 ありがとう!

答えて

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)で説明されています。 –

関連する問題