質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

5157閲覧

PowerShell DataTableを返す関数を作成したい

退会済みユーザー

退会済みユーザー

総合スコア0

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/10/20 07:34

編集2021/10/20 11:38

###前提・実現したいこと

WindowsPowerShellバージョン:2.0

・WindowsPowerShellにてDBからデータを抽出し、DataTableを返す関数を作成
・関数を呼び出し、DataTable型の変数に格納
⇒エラー発生

関数内ではDataTable型になっているのでreturn時に何かしらの理由で
System.Object[]型になってしまっていることが原因かと推測しています。
どうしたらエラーを回避できるかご教示下さい。よろしくお願いいたします。

発生している問題・エラーメッセージ

"System.Object[]"の値を"System.Object[]"型から"System.Data.DataTable"型に変換できません。 行43:文字17 selectTable <<<< = selectSQL;

該当のソースコード

# DB関係 [System.Data.SqlClient.SqlConnection]$objConnection = $null; [System.Data.SqlClient.SqlCommand]$objCommand = $null; [System.Data.SqlClient.SqlDataAdapter]$objAdapter = $null; [System.Data.DataSet]$objDataset =$null; [System.Data.DataTable] $objTable = $null; [System.Data.DataTable] $selectTable = $null; # 接続情報 [string]$strServer = 'XXX.XXX.XXX.XXXX' [string]$strID = 'id' [string]$strPassword = 'password' [string]$strDatabase = 'database' [string]$strConnectionString = '' #接続文字列を作成 $strConnectionString = @" Data source =$strServer; Initial Catalog=$strDatabase; User ID =$strUserId; Password=$strPassword; "@ function selectSQL() { $selectSQL = "SELECT * FROM MST_Animal"; $objConnection = New-Object -TypeName System.Data.SqlClient.SqlConnection; $objConnection.ConnectionString = $strConnectionString; $objCommand = $objConnection.CreateCommand(); $objCommand.CommandText = $selectSQL $objAdapter = New-Object -TypeName System.Data.SqlClient.SqlDataAdapter $objCommand; $objDataset = New-Object -TypeName System.Data.DataSet; [void]$objAdapter.Fill($objDataset); $objTable = $objDataset.Tables[0]; return $objTable; } $selectTable = selectSQL;

試したこと

・関数内で $objTable.GetType(); を実行し、DataTable型になっていることを確認
・下記を参考に戻り値を配列型に変換
https://ps1.hatenadiary.org/entry/20081119/p1

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

次のようにしてください。

PowerShell

1return ,$objTable

##追記

以下のコードで DataTable が返っていることを確認しました。
このコードを実行してどうなるか確かめてください。

PowerShell

1function selectSQL { 2 return , (New-Object System.Data.DataTable) 3} 4 5[System.Data.DataTable]$selectTable = selectSQL 6$selectTable.GetType()

投稿2021/10/20 07:48

編集2021/10/20 09:04
Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/10/20 08:34

ご回答ありがとうござます。こちら試してみましたが、やはり同じ内容のエラーが発生します。
Zuishin

2021/10/20 09:01

追記したコードで確かめてください。 これで DataTable になるなら、別の原因があります。
Zuishin

2021/10/20 09:01

いや、今更ですが PowerShell のバージョンが古すぎます。 バージョンアップできませんか?
Zuishin

2021/10/20 09:10

あと、function selectSQL(){ は function selectSQL { に直してください。
退会済みユーザー

退会済みユーザー

2021/10/20 11:35

追記のコメントありがとうございます。 追記して頂いたコードで確認しました。 DataTableできちんと返ってきているので別の原因のようです・・。
Zuishin

2021/10/20 11:38

$objTable が DataTable というのはどうやって確かめましたか? また、この質問に掲載されているコードは実際のものですか?
退会済みユーザー

退会済みユーザー

2021/10/20 11:44

関数内のreturn $objTable; を $objTable.GetType(); に変更して確認しました。 追記して頂いたコードと同様の結果(DataTable型)が返ってきます。 ほぼ実際のコードですがサーバなどの接続情報やSQL部分は書き換えをしています。 非常に古くて申し訳ありませんが、私個人の端末ではないためpowershellのバージョンアップは難しいです。
Zuishin

2021/10/20 11:48

> 関数内のreturn $objTable; を $objTable.GetType(); に変更して確認しました。 ではそこではなく、$selectTable = selectSQL; を変更し、$selectTable ではなく別の object 型の変数に代入して型を確認してください。
退会済みユーザー

退会済みユーザー

2021/10/20 11:55

ありがとうございます。 型指定なしの変数に格納して型の確認を行ったところ、object[]型になっていました。 $test = selectSQL; $test.GetType();
Zuishin

2021/10/20 12:05

$test | Foreach-Object { $_.GetType() } はどうなりますか?
退会済みユーザー

退会済みユーザー

2021/10/20 12:18 編集

初歩的なミスで申し訳ありません。確認用に書いていたGetType()をコメントアウトしたら 正常に動作しました。(型の情報を出力するだけなので他の挙動には関係ない認識でした・・) 結論としては一番初めにご教示頂いた「return ,$objTable」にするのみで 解決のはずでしたが私の勘違いで余計なお手間をおかけしてしまいました。 原因の絞り込み方が大変勉強になりました。ありがとうございました。
Zuishin

2021/10/20 12:19 編集

関数の中で出力したものは戻り値に含まれます。 Adapter.Fill が何も出力しないよう [void] にキャストしているのも、その戻り値を関数の戻り値に含めないようにするためです。 また、質問のコードが実際のものかどうかを聞いたのも、中のものが省略されていないかを確かめるためです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問