ASP.NET Core アプリケーションで SqlClient, SqlConnection を利用する - C#

ASP.NET Core アプリケーションで SqlClient, SqlConnection を利用する手順を紹介します。

概要

ASP.NET Core アプリケーションでSqlConnectionを利用する場合、using System.Data.SqlClient を記述しただけでは、SqlConnectionを利用できません。 この記事では、System.Data.SqlClientのアセンブリの参照を追加して、SqlConnectionを利用できるようにする手順を紹介します。

現象の確認

ASP.NET Coreアプリケーションを作成して、Startup.cs に下記のコードを記述します。
Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace SimpleExecSql
{
  public class Startup
  {
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
      }

      app.UseRouting();

      app.UseEndpoints(endpoints =>
      {
        endpoints.MapGet("/", async context =>
              {
                SqlConnection con; 
          });
      });
    }
  }
}
上記のプロジェクトをビルドします。ビルドするとエラーが発生します。

エラーメッセージは次のものが表示されます。
エラーメッセージ
エラーコード:CS1069
型名 'SqlConnection' は名前空間 'System.Data.SqlClient' に見つかりませんでした。この型はアセンブリ 'System.Data.SqlClient, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' に転送されました。このアセンブリへの参照を追加することを検討してください。


原因

デフォルトで参照する System.Data.SqlClient アセンブリには、SqlConnectionが含まれていないことが原因です。

対処法

SqlConnectionが含まれている、System.Data.SqlClient アセンブリを参照に追加します。

手順1: NuGet を利用する方法

NuGetを利用して System.Data.SqlClient アセンブリの参照を追加します。

[ソリューション エクスプローラー]ウィンドウで、System.Data.SqlClient のアセンブリの参照を追加するプロジェクトのノードを開き、 [依存関係]のノードをクリックして選択します。選択状態で右クリックし、ポップアップメニューを表示します。メニューの[NuGet パッケージの管理]の項目をクリックします。


[NuGet パッケージ マネージャー]のウィンドウが表示されます。上部の[参照]のタブをクリックして選択します。下図の画面が表示されます。


[参照]タブの下の検索テキストボックスに、"System.Data.SqlClient" を入力して検索します。検索結果が左側のエリアに表示されます。
検索結果にある、"System.Data.SqlClient"の項目をクリックして選択します。


"System.Data.SqlClient"の項目が選択されると、詳細情報が右側に表示されます。


デフォルトでは、[バージョン]のコンボボックスは "最新の安定版" のバージョンが選択されています。[インストール]ボタンをクリックして パッケージをインストールします。~

[変更のプレビュー]ダイアログが表示されます。[OK]ボタンをクリックします。


続いて[ライセンスへの同意]ダイアログが表示されます。こちらもダイアログ下部の[同意する]ボタンをクリックします。


パッケージのインストールが実行されます。インストールが完了すると、[インストール]ボタンの表示が[アンインストール]に変わります。


プロジェクトをビルドします。エラーが発生せずにビルドできることが確認できます。


プロジェクトファイルの内容を確認します。ItemGroup タグが追加され、"System.Data.SqlClient" への参照が追加されていることが確認できます。

手順2: プロジェクトファイルを編集する方法

[ソリューション エクスプローラー]ウィンドウで System.Data.SqlClient を追加したいプロジェクトのノードをクリックして選択します。 選択状態で右クリックします。ポップアップメニューが表示されますので、メニューの[プロジェクト ファイルの編集]の項目をクリックします。


.csproj ファイルがエディタウィンドウに表示され、編集状態になります。


,csproj ファイルのXMLにItemGroup タグを記述し System.Data.SqlClinent アセンブリの参照を追加します。
変更前後の .csproj ファイルは次の通りです。
編集前: .csproj ファイル
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

</Project>
編集後: .csproj ファイル
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="System.Data.SqlClient" Version="4.8.0" />
  </ItemGroup>

</Project>

変更後 .csproj ファイルを保存し、プロジェクトを再度ビルドします。エラーが発生せずにビルドできることが確認できます。

補足: ASP.NET Core 3.1 の場合

編集前: .csproj ファイル
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

</Project>
編集後: .csproj ファイル
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="System.Data.SqlClient" Version="4.6.0" />
  </ItemGroup>
  
</Project>

プログラムの作成

SqlConnection を利用できるようになりましたので、プログラムを実装します。
下記のコードを記述します。
Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace SimpleExecSql
{
  public class Startup
  {
    public void ConfigureServices(IServiceCollection services)
    {
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
      }

      app.UseRouting();

      app.UseEndpoints(endpoints =>
      {
        int count = -1;

        endpoints.MapGet("/", async context =>
        {
          using (SqlConnection con = new SqlConnection(@"Data Source=[DBサーバーのホスト名 または IPアドレス];Initial Catalog=[接続するデータベース名];Connect Timeout=60;Persist Security Info=True;User ID=[DBの接続ユーザー名];Password=[DBの接続パスワード]")) {
            con.Open();
            SqlCommand com = new SqlCommand("select count (*) from ProductsA", con);
            count = (int)com.ExecuteScalar();
            con.Close();
          }
          context.Response.ContentType = "text/plain; charset=utf-8";
          await context.Response.WriteAsync("レコード数:" + count.ToString());
        });
      });
    }
  }
}

データベースのテーブルは "ProductsA" の名前のテーブルを用意しています。

実行結果

上記のWebアプリケーションを実行します。アプリケーションのルートURLにアクセスします。下図の結果が表示されます。
テーブルのレコード数がレスポンスの値として表示される動作が確認できます。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2021-05-08
作成日: 2021-05-08
iPentec all rights reserverd.