SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

PowerShell (7.0.2) で Microsoft.Data.SqlClient 2.0 を使用する

without comments

Released: General Availability of Microsoft.Data.SqlClient 2.0 でアナウンスされましたが、.NET で SQL Server にアクセスするための最新のデータプロバイダーである Microsoft.Data.SqlClient 2.0 がリリースされました。

アナウンスや、リリースノート でも触れられていますが、いくつかの機能が追加されています。

Some of the highlights of new features over the 1.1 release of Microsoft.Data.SqlClient include:

 

PowerShell から新機能の検証をしようと思ったところ、Microsoft.Data.SqlClient 2.0 を使用するのにちょっとハマったので、メモを残しておこうかと。

動作方法がよくわかっていなかったので、"Microsoft.Data. SqlClient is not supported on this platform." when trying to use it in PowerShell 7.0.2 で助けていただきました (感謝)

Microsoft.Data.SqlClient with PowerShell も参考にさせていただきました。
(本ドキュメントを書かれていた方に Issue でヘルプいただけて感謝、感謝)

Microsoft.Data.SqlClient 2.0.0 の入手は、Install-Package や、Nuget の「Donwnload Package」から、nupkg ファイルをダウンロードして、拡張子を zip に変更してファイルを展開することで、DLL を取得することができます。

今回は Windows 環境の PowerShell 7.0.2 で実行しているのですが、この環境の場合、使用するファイルは展開したファイル内に含まれている「runtimes\win\lib\netcoreapp2.1\Microsoft.Data.SqlClient.dll"」となります。

Microsoft.Data.SqlClient の DLL については、いくつかのディレクトリに存在していますが、「runtimes\win\lib」 配下ではなく、「lib」 配下の DLL をロードして使用すると、

New-Object: Exception calling ".ctor" with "1" argument(s): "Microsoft.Data.SqlClient is not supported on this platform."

となると思いますので「runtimes\win\lib」配下の DLL を読み込むようにします。

今回は「D:\Microsoft.Data.SqlClient」ディレクトリ配下に DLL を配置して次のようなスクリプトを実行しています。

 

Add-Type -Path "D:\Microsoft.Data.SqlClient\Microsoft.Data.SqlClient.dll"
$con = New-Object Microsoft.Data.SqlClient.SqlConnection("Server=xxxxx;User=xxxxx;Password=xxxxx")
$con.Open()

 

適切な DLL を Add-Type することで「"Microsoft.Data.SqlClient is not supported on this platform."」の例外は発生しなくなりますが、これだけですと、

Exception calling "Open" with "0" argument(s): "The type initializer for ‘Microsoft.Data.SqlClient.TdsParser’ threw an exception."

の例外が発生する状態になるかと思います。

例外の詳細を確認するために、次のコードを実行してみます。

$Error[0].Exception

 

例外の詳細が確認できるのですが、次のような例外が発生していることが確認できます。

InnerException              : System.TypeInitializationException: The type initializer for ‘Microsoft.Data.SqlClient.TdsParser’ threw an exception.

                               —> System.TypeInitializationException: The type initializer for ‘Microsoft.Data.SqlClient.SNILoadHandle’ threw an exception.

                               —> System.DllNotFoundException: Unable to load DLL ‘Microsoft.Data.SqlClient.SNI.dll’ or one of its dependencies: 指定されたモジュールが見つかりません。 (0x8007007E)

「Microsoft.Data.SqlClient.SNI.dll」のロードでエラーとなっていることが確認できますね。

NuGet の Dependencies から確認できますが、Microsoft.Data.SqlClient は、「2.0.0-preview4.20142.4」以降は、依存関係に「Microsoft.Data.SqlClient.SNI.runtime (>= 2.0.0)」が追加されています。

image

 

Microsoft.Data.SqlClient.SNI.runtime から、nupkg をダウンロードして zip に拡張子を変更し、展開したファイルの「runtimes\win-x64\native\Microsoft.Data.SqlClient.SNI.dll」を、Microsoft.Data.SqlClient.dll と同一のディレクトリに保存しておきます。

image

これで、動作させることができるかと思います。

新機能の AAD の対話型認証をを実行する場合は、Microsoft.Identity.Client を Add-Type しておく必要があったりと、使用する機能によって、さらにロードしなくてはいけないアセンブリは変わってきますが、シンプルな処理であれば、上記の 2 種類の DLL で実行できそうです。

新機能として、SqlBulkCopy_ColumnOrderHint がありますが、PowerShell からも使用できることが確認できました。

(SqlBulkCopyColumnOrderHint を指定した場合、Insert Bulk に ORDER 句が追加されていることが確認できます)

image

今回は、SqlBulkCopyColumnOrderHint と、接続文字列に「Authentication=Active Directory Interactive」を指定した場合の挙動しか確認できていないのですが、PowerShell からの実行方法が分かったので、時間があるときに他の機能も確認したいですね。

Written by Masayuki.Ozawa

6月 22nd, 2020 at 9:52 pm

Posted in PowerShell,SQL Server

Tagged with ,

Leave a Reply