SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

MonoでDBMS用データプロバイダを使う

Monoで他のDBも使ってみたよ!(SQL Server、Oracle編)

MonoでSQL Server、Oracleを使う

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード 修正サンプル (125.0 KB)

DBアクセス

 データアダプタを使用したDBアクセスについて解説します。

接続確認

 接続確認用として、SELECT文を実行する以下のコード(C#)を使用しました。

select1.cs
using System;
using System.Data;
using System.Data.SqlClient;

namespace SqlServerExample
{
  public class Select1
  {
    public static void Main(string[] args)
    {
      // 接続文字列
      string constr = "Data Source=192.168.1.2,1031;" +
"Initial Catalog=TestData;" +
"User ID=sta;" +
"Password=passW0rd;" +
"Trusted_Connection=False";
// SQL文字列 string sstr = "SELECT ProductID, ProductName, Price, ProductDescription " + "FROM Products"; using (SqlConnection dbcon = new SqlConnection(constr)) { using (SqlDataAdapter da = new SqlDataAdapter(sstr, dbcon)) using (DataTable dt = new DataTable()) { // SELECT実行 da.Fill(dt); foreach (DataRow dr in dt.Rows) { Console.WriteLine("ID:{0} NAME:{1} PRICE:{2} DESCRIPTION:{3}", dr[0], dr[1], dr[2], dr[3]); } } } } } } /* * ビルド: * * gmcs select1.cs -r:System.Data.dll * * 実行: * * mono select1.exe * */
実行結果
> mono select1.exe
ID:0 NAME:SQL Server PRICE: DESCRIPTION:SQLServer 2005 Express Edition
ID:1 NAME:Clamp PRICE:12.4800 DESCRIPTION:Workbench clamp
ID:50 NAME:Flat Head Screwdriver PRICE:3.1700 DESCRIPTION:Flat head
ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires.
ID:3000 NAME:3mm Bracket PRICE:0.5200 DESCRIPTION:
補足説明

 「SQL Server Browserサービスを有効」にした場合、接続文字列にインスタンス名を使用した以下の記述が可能になります。

接続文字列例
string constr = "Data Source=192.168.1.2\\SQLEXPRESS;" +
                "Initial Catalog=TestData;" +
                "User ID=sta;" +
                "Password=passW0rd;";

動作確認

 「4.PostgreSQL編ーDBアクセスー動作確認」で使用したコンソールプログラムを使用して動作確認を行います。構成情報ファイル(cs.config)に以下の内容を追加します。

cs.config
<?xml version="1.0" encoding="UTF-8" ?>
<connectionStrings>
  <add name="Sqlite" providerName="Mono.Data.Sqlite"
    connectionString="Data Source=/home/sta/data/TestData.db" />
  <add name="Postgresql" providerName="Npgsql"
    connectionString="Server=localhost;Port=5432;User Id=postgres;Password=password;Database=TestData;" />
  <add name="MySql" providerName="MySql.Data"
    connectionString="Server=192.168.1.2;Database=TestData;Uid=sta;Pwd=password;CharSet=utf8" />
  <add name="SqlServer" providername="System.Data.SqlClient"
connectionstring="Data Source=192.168.1.2,1031;Initial Catalog=TestData;User ID=sta;Password=passW0rd;Trusted_Connection=False" />
</connectionStrings>
実行例(データの削除)
> mono client.exe
Connect to
1:SQLite
2:PostgreSQL
3:MySQL
4:SqlServer
5:Oracle
?> 4
状態:Unchanged ID:0 NAME:SQL Server PRICE: DESCRIPTION:SQLServer 2005 Express Edition
状態:Unchanged ID:1 NAME:Clamp PRICE:12.4800 DESCRIPTION:Workbench clamp
状態:Unchanged ID:50 NAME:Flat Head Screwdriver PRICE:3.1700 DESCRIPTION:Flat head
状態:Unchanged ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires.
状態:Unchanged ID:3000 NAME:3mm Bracket PRICE:0.5200 DESCRIPTION:

1:INSERT
2:UPDATE
3:DELETE
4:SUBMIT
5:RELOAD
6:EXIT
?> 3
ID(int)?> 3000
状態:Unchanged ID:0 NAME:SQL Server PRICE: DESCRIPTION:SQLServer 2005 Express Edition
状態:Unchanged ID:1 NAME:Clamp PRICE:12.4800 DESCRIPTION:Workbench clamp
状態:Unchanged ID:50 NAME:Flat Head Screwdriver PRICE:3.1700 DESCRIPTION:Flat head
状態:Unchanged ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires.

1:INSERT
2:UPDATE
3:DELETE
4:SUBMIT
5:RELOAD
6:EXIT
?> 4
状態:Unchanged ID:0 NAME:SQL Server PRICE: DESCRIPTION:SQLServer 2005 Express Edition
状態:Unchanged ID:1 NAME:Clamp PRICE:12.4800 DESCRIPTION:Workbench clamp
状態:Unchanged ID:50 NAME:Flat Head Screwdriver PRICE:3.1700 DESCRIPTION:Flat head
状態:Unchanged ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires.

1:INSERT
2:UPDATE
3:DELETE
4:SUBMIT
5:RELOAD
6:EXIT
?> 6

 データテーブル内のデータ行の削除操作を行った場合、その行のRowStateプロパティがDeletedに変更されます。RowStateプロパティがDeletedのデータ行の各カラムにアクセスした場合、アクセス不可として例外が発生します。そのため、データテーブルの内容を表示する場合、RowStateプロパティを判定して、表示を行う必要があります。

main.cs から抜粋
    private static void ShowData()
    {
      foreach (DataRow dr in dt.Rows)
      {
        if (dr.RowState != DataRowState.Deleted)
        {
          Console.Write("状態:{0} ", dr.RowState);
          Console.WriteLine("ID:{0} NAME:{1} PRICE:{2} DESCRIPTION:{3}", dr[0], dr[1], dr[2], dr[3]);
        }
      }
    }

注意事項

パラメータ識別子

 SQL文字列内で使用するパラメータの識別子として、「@」が使用できます。

DbProviderFactories

 Mono 1.9.1の「machine.config(2.0 profile)」には「System.Data.SqlClient」用のデータプロバイダファクトリ情報が標準で登録されているので、特に何か追加する等の対応は必要ありません。

おまけ

 MonoDevelopからSQL Server DBへの操作(クエリの実行)が可能です。

 MonoDevelopを起動し、[データベースブラウザビュー]内の[データベース接続]アイコンを右クリックして、[接続の追加]を選択し、以下の内容を入力します。

接続の追加
設定項目 設定内容
SQL Server database
名前 TestData(SQL Server 2005 Express)
サーバ 192.168.1.2
ポート 1031
ユーザ名 sta
パスワード passW0rd
データベース TestData

 MonoDevelopのメニューから[ツール]-[データベース]-[データベースをクエリ]を選択する(または、[データベースブラウザビュー]内の[TestData(SQL Server 2005 Express)]アイコンをダブルクリックする)と、SQLクエリ入力画面が表示されます。

次のページ
7.Oracle編

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
MonoでDBMS用データプロバイダを使う連載記事一覧

もっと読む

この記事の著者

sta(エステーエー)

風来坊blog:sta.blockhead

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2920 2008/12/24 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング