DBアクセス
データアダプタを使用したDBアクセスについて解説します。
接続確認
接続確認用として、SELECT文を実行する以下のコード(C#)を使用しました。
using System; using System.Data; using System.Data.OracleClient; namespace OracleExample { public class Select1 { public static void Main(string[] args) { // 接続文字列 string constr = "Server=192.168.1.2;" +
"User ID=testdata;" +
"Password=password;";
// SQL文字列 string sstr = "SELECT ProductID, ProductName, Price, ProductDescription " + "FROM Products"; using (OracleConnection dbcon = new OracleConnection(constr)) { using (OracleDataAdapter da = new OracleDataAdapter(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 -r:System.Data.OracleClient.dll * * * 実行: * * mono select1.exe * */
> mono select1.exe ID:0 NAME:Oracle PRICE: DESCRIPTION:Oracle Database 10g Express Edition ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires. ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION:
動作確認
「4.PostgreSQL編ーDBアクセスー動作確認」で使用したコンソールプログラムを使用して動作確認を行います。構成情報ファイル(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" /> <add name="Oracle" providerName="System.Data.OracleClient"
connectionString="Server=192.168.1.2;User ID=testdata;Password=password;" /> </connectionStrings>
> mono client.exe Connect to 1:SQLite 2:PostgreSQL 3:MySQL 4:SqlServer 5:Oracle ?> 5 状態:Unchanged ID:0 NAME:Oracle PRICE: DESCRIPTION:Oracle Database 10g Express Edition 状態:Unchanged ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp 状態:Unchanged ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head 状態:Unchanged ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires. 状態:Unchanged ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION: 1:INSERT 2:UPDATE 3:DELETE 4:SUBMIT 5:RELOAD 6:EXIT ?> 1 ID(int)?> 2 NAME(string)?> test PRICE(num)?> 2 DESCRIPTION(string)?> for test 状態:Unchanged ID:0 NAME:Oracle PRICE: DESCRIPTION:Oracle Database 10g Express Edition 状態:Unchanged ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp 状態:Unchanged ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head 状態:Unchanged ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires. 状態:Unchanged ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION: 状態:Added ID:2 NAME:test PRICE:2 DESCRIPTION:for test 1:INSERT 2:UPDATE 3:DELETE 4:SUBMIT 5:RELOAD 6:EXIT ?> 2 ID(int)?> 75 NAME(string)?> PRICE(num)?> 75 DESCRIPTION(string)?> タイヤ交換用の道具 状態:Unchanged ID:0 NAME:Oracle PRICE: DESCRIPTION:Oracle Database 10g Express Edition 状態:Unchanged ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp 状態:Unchanged ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head 状態:Modified ID:75 NAME:Tire Bar PRICE:75 DESCRIPTION:タイヤ交換用の道具 状態:Unchanged ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION: 状態:Added ID:2 NAME:test PRICE:2 DESCRIPTION:for test 1:INSERT 2:UPDATE 3:DELETE 4:SUBMIT 5:RELOAD 6:EXIT ?> 3 ID(int)?> 3000 状態:Unchanged ID:0 NAME:Oracle PRICE: DESCRIPTION:Oracle Database 10g Express Edition 状態:Unchanged ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp 状態:Unchanged ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head 状態:Modified ID:75 NAME:Tire Bar PRICE:75 DESCRIPTION:タイヤ交換用の道具 状態:Added ID:2 NAME:test PRICE:2 DESCRIPTION:for test 1:INSERT 2:UPDATE 3:DELETE 4:SUBMIT 5:RELOAD 6:EXIT ?> 4 状態:Unchanged ID:0 NAME:Oracle PRICE: DESCRIPTION:Oracle Database 10g Express Edition 状態:Unchanged ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp 状態:Unchanged ID:2 NAME:test PRICE:2 DESCRIPTION:for test 状態:Unchanged ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head 状態:Unchanged ID:75 NAME:Tire Bar PRICE:75 DESCRIPTION:タイヤ交換用の道具 1:INSERT 2:UPDATE 3:DELETE 4:SUBMIT 5:RELOAD 6:EXIT ?> 6
注意事項
パラメータ識別子
SQL文字列内で使用するパラメータの識別子として、「:」が使用できます。今回、動作確認を行ったOracle以外のDBMSでは、「@」が使用できるので、Oracleを使用しない場合は、パラメータ識別子に配慮する必要はなくなります。
DbProviderFactories
Mono 1.9.1の「machine.config(2.0 profile)」には「System.Data.OracleClient」用のデータプロバイダファクトリ情報が標準で登録されているので、特に何か追加する等の対応は必要ありません。
おまけ
残念ながら、「monodevelop-database」(MonoDevelop用アドイン)パッケージには、Oracle用のアドインが存在しないので、MonoDevelopからOracle DBへの操作(クエリの実行)はできませんでした。
8.まとめ
MonoとPostgreSQL、MySQL、SQL Server、Oracleを使用したDBアクセスについて解説を行いました。SQLiteを含めると、5つのDBMSへのデータプロバイダファクトリを使用した汎用的なコード記述によるDBアクセスを試すことができました。MonoでのADO.NET 2.0サポートをある程度確認できたことになると思います。
さて、ぼやほやしているうちにMono 2.0がリリースされてしまいました。Mono 2.0ではLINQ to * が充実しつつあるようです。もともとMonoでLINQ to SQLを試そうと調べ始めましたが、「Mono 1.9.1では標準でLINQ to SQL(System.Data.Linq)は提供されていない」→「LINQ to SQLはLINQ to SQL Serverなの!?」→「意気消沈」という変遷を経て、もっと基本的なことから試してみよう、と持ち直した結果が、前回と今回の記事を書くことにつながりました。
また機会があれば、Mono 2.0以降でのLINQ to * 関連や、MonoでのDBアクセス以外の動作についても紹介したいと思います。ではまた。