【.NET5/Core MVC】
デバッグ環境用としてDockerコンテナからホスト機のSQL Server EXPRESSにODBC接続する手順

記事イメージ


(最終更新日:

お疲れ様です。堺です。

ASP.NET Core MVCアプリ開発時のデバッグのため、DockerからローカルPCのSQL Server ExpressにODBC接続したかったのですが、ドキュメントの少なさもあり、かなり苦労させられました。

すったもんだの末に接続には成功したので、結論を共有しておこうと思います。

今回構築する構成図です。
今回構築する構成図です

結論:これらの設定が必要

個別の設定は、詳しいページがありますので適宜引用します。

手順1:SQL Serverへのリモートアクセスを許可する

こちらに詳しい手順が掲載されています:SQL Serverへリモート接続するために必要な設定(外部リンク)

要約すると、次の3点です。

  • SSMS(Sql Server Management studio)->インスタンス右クリック->プロパティ->接続->「このサーバーへのリモート接続を許可する」のチェックをONに。
  • SQL Server構成マネージャー->SQL Serverネットワークの構成->TCP/IPを有効化。
  • サービス->「SQL Server Browser」のサービスを起動。

尚、1点目はデフォルトでONになっていますが、2,3点目は手動で設定が必要です。

SQL Server構成マネージャーはスタートメニューの「Microsoft SQL Server 20XX」の中にありますが、見つからない場合は、C:\Windows\System32フォルダーで「SQLServerManager*.msc」と検索をかければ見つかると思います。

system32フォルダーでの構成マネージャー検索。Microsoft SQL Server 2019の場合の対応するファイル名は「SQLServerManager15.msc」です。
system32フォルダーでの構成マネージャー検索
サービスの編集画面は、Windowsの検索機能で発見できると思います。
サービスの編集画面は、Windowsの検索機能で発見できると思います

尚、この操作の後、SQL Serverのサービスを再起動するのを忘れないようにしましょう。

手順2:SQL Serverのサーバー認証モードでSQL Server認証を許可

SSMS->インスタンス右クリック->プロパティ->セキュリティ->サーバー認証、でラジオボタンを「SQL Server認証モードとWindows認証モード」に切り替え

デフォルトでは「Windows認証モード」になっているので、主導で切り替えが必要です。
デフォルトでは「Windows認証モード」になっているので、主導で切り替えが必要です

手順3:SQL Server認証のアカウントを作成し有効化する

こちらに詳しい手順が掲載されています:SQL Server 新規にログインアカウントを作成する(外部リンク)

手順4:接続文字列をローカルIPアドレスで指定する

最終的にたどり着いた接続文字列が↓です。

Data Source=192.168.XXX.XXX\SQLEXPRESS;Initial Catalog=(データベース名);Persist Security Info=True;User ID=(SQL Server認証アカウントのユーザー名);Password=(同左パスワード)

IPアドレスは、ローカルネットワーク内での接続先PCのものです。不明な方は、接続先PCでコマンドプロンプトを立ち上げ(Windows+Rキー->「cmd」と入力して起動)、ipconfigというコマンドを入力することで確認することができます。通常の環境ならば、192.168.~から始まるIPv4アドレスが見つかると思います。

ちなみに開発期間中はローカルIPアドレスを固定しておいた方がいいでしょう。

詳しい設定方法はこちらの記事で詳しく紹介されています。パソコンのIPアドレスを固定したい(外部リンク Windows Vistaでの設定方法紹介ですが、Win10など新しいOSでも同じ画面です。)

頻出エラーメッセージ集

System.Data.SqlClient.SqlException (0x80131904): Cannot authenticate using Kerberos.

→Windows認証で接続しようとすると、このメッセージではねられることがあります。SQL Server認証のアカウントを作り、接続文字列もSQL認証のものに変更してみましょう。

System.Exception: Cannot connect to SQL Server Browser.

→接続文字列でローカルIPアドレスではなく名前付きインスタンス名(パソコン名が入っている名前など)を使用するとこれが出ます。

SQL Server Browserは名前付きインスタンスに接続するために使用されていますが、IPアドレスで接続先を直接指定すれば不要になります。

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 25 - Connection string is not valid)

接続要求がサーバーに到達していないか、権限によるエラーです。

特に手順1あたりを特によく確認してみましょう。また、再起動を必要とする設定変更も多分に含んでいるため、設定を変更したら面倒でも都度WindowsやSQL Serverインスタンスを再起動してリトライしてみましょう。

System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server.

→同じくネットワークエラー。接続失敗する理由は様々ですが、接続文字列かログイン情報を見直すしかないと思います。尚、理屈的にはWindows側のファイヤウォールの受信設定も必要だと思われますので注意してください。(私の環境では変更なしでOKでした。)

PlatformNotSupportedException: LocalDB is not supported on this platform.

SQL Server Express LocalDBのインスタンスを使用するとこのエラーが出ます。LocalDBはLinuxは未対応のようです。Expressのインスタンスに接続する方法を何とか考えましょう。

結び:ASP.NET Coreは凄くいいんだけど、情報が少ない・・・

日本語・英語を問わず、ドキュメントが少ない気がしますね~。。。

公式ドキュメントでも解決できない問題もまぁまぁ出ますし。

同じようなハマりをした方の救いになれば幸いです。グッドラック!

記事筆者へのお問い合わせ、仕事のご依頼

当社では、IT活用をはじめ、業務効率化やM&A、管理会計など幅広い分野でコンサルティング事業・IT開発事業を行っております。

この記事をご覧になり、もし相談してみたい点などがあれば、ぜひ問い合わせフォームまでご連絡ください。

皆様のご投稿をお待ちしております。

記事筆者へ問い合わせする

※ご相談は無料でお受けいたします。
IT活用経営を実現する - 堺財経電算合同会社