SE の雑記

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

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

leave a comment

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 については Microsoft.Data.SqlClient 名前空間の概要 でドキュメントが公開されていますので、こちらも確認すると良いかと思います。

Microsoft.Data.SqlClient の入手

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」のロードでエラーとなっていることが確認できますね。

Microsoft.Data.SqlClient.SNI の追加

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 と同一のディレクトリに保存しておきます。(最新だと Microsoft.Data.SqlClient.SNI.x64.dll / Microsoft.Data.SqlClient.SNI.x86.dll になっていますので、適切なアーキテクチャのファイルをコピーしておきます)

image

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

SqlClient.SNI については、ドキュメントの次の内容でも触れられています。

SNI (Server Name Indication) についても説明がされていますね。

SNI は、Windows 上での実行時にさまざまなネットワーク操作を行うために SqlClient が依存するネイティブ C++ ライブラリです。

 

新機能の利用

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

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

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

image

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

 

追記

上記は PowerShell 7.0 で実行していますが、Microsoft.Data.SqlClient は .NET Framework 向けにも提供されていますので、Windows PowerShell (PowerShell 5.1) でも動作させることは可能です。

こちらは 2021 に追記をしているので上記の内容とバージョンが異なっているのですが、追記を書いている時点では次のモジュールを使用することで Windows PowerShell 上でも動作させることができます。

SNI については、上記の対応と同様で、Microsoft.Data.SqlClient.dllと同じディレクトリ内に保存しておきます。

PowerShell Core と実施する内容はほとんど同じで、.NET Framework 用の DLL をロードするようにしておけば、Windows PowerShell 上でも動作させることは可能です。

Add-type -Path "C:\SqlClient\microsoft.identity.client.4.21.1.nupkg\lib\net461\Microsoft.Identity.Client.dll"
Add-Type -Path "C:\SqlClient\microsoft.data.sqlclient.2.1.2.nupkg\runtimes\win\lib\net46\Microsoft.Data.SqlClient.dll"
Share

Written by Masayuki.Ozawa

6月 22nd, 2020 at 9:52 pm

Posted in PowerShell,SQL Server

Tagged with ,

Leave a Reply