2016-09-30 7 views
2

アプリケーションに埋め込まれたPowershellを使用してデータベース値を取得します。 SQLクエリは複数の値を持つことができます。私は、私に単一の価値を返すように働くコードを得ました。しかし、私は1つ以上のレコードを取得していない(または私はそれにアクセスすることができません)。また、レコードの数を表示するために.Countを使用することもできません。SQLクエリから複数の値を返す方法

このコードは、単一のDBレコードのために働く:

  $conn=New-Object System.Data.SqlClient.SQLConnection("Persist Security Info=True;Initial Catalog=;Data Source=;User ID=;Password=;MultipleActiveResultSets=True;") 
      $conn.Open() | out-null 
      $cmd1=$conn.CreateCommand() 
      $cmd1.CommandType = [System.Data.CommandType]::Text 
      $cmd1.CommandText = ("SELECT Supplier_Code FROM V_SUPPLIERINFO WHERE ACN='" + $Context.File.Field[10] + "'") 
      $reader = $cmd1.ExecuteReader() 
      #LOOP THROUGH RECORDS 
      for ($i=0; $i -lt $cmd1.Count; $i++){ 
      } 
      $Context.File.Notes = "I have past the File Note - Count Script: " + $cmd1.Count 
      $reader.Read() | out-null 
      $Context.File.Field[11] = $reader.GetString(0) 
      $Context.File.Save() 
      return "done" 

を今、私はすべての結果をループしたいと思います。理想的には、返される結果の数を取得するために$ reader.countのようなものを使用します。ただし、カウントは常に1を返します。

$ conn = New-Object System.Data.SqlClient.SQLConnection( "セキュリティ情報を永続化する;初期カタログ=;データソース=;ユーザーID =;パスワード=; MultipleActiveResultSets = True; ") $ conn.Open()|アウトヌル

  $SQLRecordCount=$conn.CreateCommand() 
      $SQLRecordCount.CommandType = [System.Data.CommandType]::Text 
      $SQLRecordCount.CommandText = ("SELECT COUNT (Supplier_Code) FROM V_SUPPLIERINFO WHERE ACN='" + $Context.File.Field[10] + "'") 
      $reader = $SQLRecordCount.ExecuteReader() 

      $reader.Read() | out-null 
      $Context.File.Notes = "Total DB Records: " + $reader.GetString(0) 

      $cmd1=$conn.CreateCommand() 
      $cmd1.CommandType = [System.Data.CommandType]::Text 
      $cmd1.CommandText = ("SELECT Supplier_Code FROM V_SUPPLIERINFO WHERE ACN='" + $Context.File.Field[10] + "'") 
      $reader = $cmd1.ExecuteReader() 

      #$Context.File.Notes = "Total DB Records: " + $cmd1.length 

      #LOOP THROUGH RECORDS 
      for ($i=0; $i -lt $cmd1.Count; $i++){ 
      } 

      $reader.Read() | out-null 
      $Context.File.Field[11] = $reader.GetString(0) 
      $Context.File.Save() 
      return "done" 

しかし、それは常に私がレコードの数が見つかっ取得する方法値1

任意のアイデアを返すか、どのように私は、レコードをループすることができますか?

答えて

2

あなたは$ cmd1ではなく$ readerを調べるべきだと思います。 This MSDN blog postには、実行しようとしているのと同じ例が表示されます。ポストから

# Create and open a database connection 
$sqlConnection = new-object System.Data.SqlClient.SqlConnection “server=SERVERNAME\INSTANCE;database=AdventureWorks;Integrated Security=sspi” 
$sqlConnection.Open() 

#Create a command object 
$sqlCommand = $sqlConnection.CreateCommand() 

$sqlCommand.CommandText = “select FirstName, LastName from Person.Contact where LastName like 'W%'” 

#Execute the Command 
$sqlReader = $sqlCommand.ExecuteReader() 

#Parse the records 
while ($sqlReader.Read()) { $sqlReader[“LastName”] + “, ” + $sqlReader[“FirstName”]} 

# Close the database connection 
$sqlConnection.Close() 
+0

ありがとうございました。それから私はカウントを必要としません。 – RogerV

0

変更$リーダー= $ cmd1.ExecuteReader() TO:$リーダー= $ cmd1.ExecuteReader([のSystem.Data.CommandBehavior] :: CloseConnection)

次に列の値を繰り返して呼び出すだけです

$ reader | ForEach-Objectに{$ _。項目(「Supplier_Code」)}

0

あなたは本当に物事にそこに苦労をしている.... 私はPowerShellのInvoke-Sqlcmd内蔵またはInvokeQueryと呼ばれる、私が開発したモジュールを使用するを使用することをお勧めしこれはずっと柔軟で強力です。いずれにしても、適切なpowershell配列を取得し、カウントを実行して結果を反復するのは簡単です。また、コードの行数もはるかに少なくなっています。あなただけの2番目のコードブロックのように、DBクエリから単一の値を取得している場合

#Install-Module -Name InvokeQuery 
$server = "mysqlserver.mydomain.com" 
$db = "mydatabaseName" 
$params = @{ "ACN"=$Context.File.Field[10] } 
$sql = "SELECT Supplier_Code FROM V_SUPPLIERINFO WHERE [email protected];" 
$results = Invoke-SqlServerQuery -Sql $sql -Server $server -Database $db -Parameters $params 
# now getting a count is trivial 
Write-Host "Returned $($results.count) rows." 
# and you can use standard powershell formatting to view the data in table format: 
$results | ft 

また、あなたがリーダーを使用する必要はありません、あなたはExecuteScalarメソッドを使用することができますし、それよ最初の行の最初の列の値を返します。私のpowershellモジュールも同様のスイッチを持っています。

## same code as above. 
$sql = "SELECT count(*) FROM V_SUPPLIERINFO WHERE [email protected];" 
$count = Invoke-SqlServerQuery -Sql $sql -Server $server -Database $db -Parameters $params -Scalar 
Write-Host "The row count is $count." 
関連する問題