自己投資としてチャレンジしている内容を Blog で公開しています。
今回は C# で .NET Data Provider for SQL Server (SqlClient) を使い SQL Server に接続し Select 文を実行する方法について紹介します。
▼1. C# で SQL Server on Ubuntu へ接続
本 blog では SQL Server への接続や処理に関して Python や Java でのコーディングについて、以下のリストのように紹介していました。今回は C# で試してみます。
(2022/12 時点)
- Python – SQL Server on Ubuntu サンプルデータの作成 v2 No.97
- Python -SQL Server on Ubuntu 検索結果をAzure Blob Storageに保存 No96
- Python – SQL Server on Linux 検索結果をファイルに保存 No.95
- Python – SQL Server on Linux トランザクションでクエリを制御する方法 No.94
- Python – SQL Server on Ubuntu のエラーハンドリング & リトライ方法 No.93
- Python – SQL Server on Ubuntu に接続する方法 No.92
- Python – SQL Server サンプルデータの作成 No.62
- Java – SQL Server 統計情報の更新 Visual Studio Code on Ubuntu No.91
- Java – SQL Server サンプルデータ作成 v2 on Ubuntu No.89
- Java – SQL Server サンプルデータの作成 VS Code No.87
- Java – SQL Server 検索結果をAzure Blob Storage に保存 No.75
- Java – SQL Server Select 実行結果をテキストに保存 No.70
- Java – JDBC Driver for SQL Server on Ubuntuの自動リトライ接続 No53
- Java – Azure SQL DB への ActiveDirectoryPassword を使った接続 No.10
- Java – SQL Server on Linux トランザクションでクエリを制御する方法 No9
- Java – SQL Server on Linux で select を実行する方法 On Ubuntu No.8
- Java – JDBC Driver for SQL Server の接続文字列について No.7
- Java – SQL Server on Linux に接続時の「エラーハンドリング」 &「リトライ」方法 No.6
- Java – SQL Server on Linux に接続する方法 on Ubuntu No.5
▼2. 事前準備
2-1. Ubuntu 20.04.2 LTS の利用
https://releases.ubuntu.com/20.04/
2-2. Visual Studio Code のインストール
https://code.visualstudio.com/docs/setup/linux
sudo snap install --classic code
2-3. C# extension のインストール
Ctrl+P のキーを押し、ext install ms-dotnettools.csharp を入力し Enter キーを押すとインストールが開始され、完了後以下のような表示となります。Ref:C# – Visual Studio Marketplace
2-4. Microsoft package signing key を trusted key のリストへ追加し、併せてパッケージのリポジトリの追加
今回 Ubuntu 22.04 を使っているので、ドキュメントに従い .NET のインストールを進めます。
Install .NET on Ubuntu – .NET | Microsoft Docs
最初に Microsoft package signing key を trusted key のリストへ追加し、併せてパッケージのリポジトリの追加を行うコマンドを実行 (Ubuntu 20.04)
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
2-5. .NET SDK をインストール (Ubuntu 20.04)
sudo apt-get update && sudo apt-get install -y dotnet-sdk-6.0
(** Note) 手元で検証した際以下のエラーがでました。エラーの通り “apt –fix-broken install” を実行し、再度 .net SDK 6.0 をインストールします。
xxx W: Target CNF (main/cnf/Commands-amd64) is configured multiple times in /etc/apt/sources.list.d/microsoft-prod.list:1 and /etc/apt/sources.list.d/mssql-release.list:1 W: Target CNF (main/cnf/Commands-all) is configured multiple times in /etc/apt/sources.list.d/microsoft-prod.list:1 and /etc/apt/sources.list.d/mssql-release.list:1 Reading package lists... Done Building dependency tree Reading state information... Done You might want to run 'apt --fix-broken install' to correct these. The following packages have unmet dependencies: dotnet-sdk-6.0 : Depends: dotnet-targeting-pack-6.0 (>= 6.0.12) but it is not going to be installed Depends: netstandard-targeting-pack-2.1 (>= 2.1.0) but it is not going to be installed Depends: aspnetcore-runtime-6.0 (>= 6.0.12) but it is not going to be installed Depends: dotnet-apphost-pack-6.0 (>= 6.0.12) but it is not going to be installed Depends: dotnet-runtime-6.0 (>= 6.0.12) but it is not going to be installed Depends: aspnetcore-targeting-pack-6.0 (>= 6.0.12) but it is not going to be installed mysql-connector-odbc-setup : Depends: mysql-connector-odbc (= 8.0.31-1ubuntu20.04) but it is not installable E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
2-6. .NET SDK インストールを確認
dotnet
(results)
Usage: dotnet [options]
Usage: dotnet [path-to-application]
Options:
-h|--help Display help.
--info Display .NET information.
--list-sdks Display the installed SDKs.
--list-runtimes Display the installed runtimes.
path-to-application:
The path to an application .dll file to execute.
▼3. C# で SQL Server に接続して Select 結果を出力する
3-1. アプリケーションの作成し、作成したディレクトリで VSCode を起動
dotnet new console -o MytestApp
cd MytestApp
code .
3-2. MytestApp.csproj に System.Data.SqlClient を追加し保存 (Ctrl+ s)
SQL Server への接続に必要な .NET Data Provider for SQL Server の名前空間 System.Data.SqlClient を登録します。2022/12 の最新 Version 4.8.5 を指定しています。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="System.Data.SqlClient" Version="4.8.5" /> </ItemGroup> </Project>
- C# Ubuntu (sqlchoice.azurewebsites.net)
- System.Data.SqlClient 名前空間 | Microsoft Learn
- NuGet Gallery | System.Data.SqlClient
3-3. 追加した System.Data.SqlClient を Project に反映
dotnet restore
3-4. C# のコード Program.cs 作成
SQL Server には sa のユーザーで接続しています。sa のパスワードは Password で指定します。Database 名は “sampledb1” を指定しています。
参照しているデータは、以前以下の blog で紹介したサンプルデータです。
Python – SQL Server on Ubuntu サンプルデータの作成 v2 No.97
using System;
using System.Data.SqlClient;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
try
{
// Build connection string
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = "localhost";
builder.UserID = "sa";
builder.Password = "password";
builder.InitialCatalog = "sampledb1";
// Connect to SQL
Console.Write("Connecting to SQL Server ... ");
using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
{
connection.Open();
Console.WriteLine("Done.");
// execute select query
String sql = "SELECT id, cdatetime, note FROM sampletb";
using (SqlCommand command = new SqlCommand(sql, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("{0} {1} {2}", reader.GetInt32(0), reader.GetDateTime(1) ,reader.GetString(2));
}
}
}
}
}
catch (SqlException e)
{
Console.WriteLine(e.ToString());
}
}
}
}
3-5. コードの実行結果
dotnet run
Connecting to SQL Server ... Done.
3366109 12/9/2022 1:59:12 PM int
3366109 12/9/2022 1:59:12 PM mcranentiv
6732218 12/9/2022 1:59:12 PM orlsojlvuu
10098327 12/9/2022 1:59:12 PM uaclnlkehv
13464436 12/9/2022 1:59:12 PM xngcehsmtc
16830545 12/9/2022 1:59:12 PM llvzgooqaa
20196654 12/9/2022 1:59:12 PM atmordnpfz
23562763 12/9/2022 1:59:12 PM qpzlferdra
26928872 12/9/2022 1:59:12 PM lnbjlmclxx
30294981 12/9/2022 1:59:12 PM xfspqvetbf