動作確認
基本的なDB操作(登録、更新、削除)を確認するために、次のコード(C#)を使用します。db4o DBはEmbeded Serverモードでオープンします。作業する上でのディレクトリ構造は、下表の通りとします。
ディレクトリ | ファイル |
---|---|
~/src/cs/db4oExample | IProductRepository.cs |
~/src/cs/db4oExample/Test | client.cs, client.exe.config |
~/src/cs/db4oExample/TestData | ProductRepository.cs, TestDataHelper.cs |
IProductRepositoryインターフェース、ProductRepository、TestDataHelperクラス
[IProductRepository.cs]
- using System;
- namespace db4oExample
- {
- public interface IProductRepository : IDisposable
- {
- void Add(Product product);
- void Update(Product product);
- void Remove(Product product);
- void GetAll();
- }
- }
[ProductRepository.cs]
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using Db4objects.Db4o;
- using Db4objects.Db4o.Linq;
- using db4oExample;
- namespace db4oExample.TestData
- {
- public class ProductRepository : IProductRepository
- {
- private static IList<Product> _cache;
- public void Add(Product product)
- {
- using (IObjectContainer client = TestDataHelper.OpenClient())
- {
- Product r1 = _getByIdFromCache(product.Id);
- if (r1 != null)
- {
- Console.WriteLine("Add:既にデータあり #1");
- return;
- }
- Product r2 = _getById(client, product.Id);
- if (r2 != null)
- {
- Console.WriteLine("Add:既にデータあり #2");
- return;
- }
- try
- {
- client.Store(product);
- client.Commit();
- }
- catch(Exception ex)
- {
- Console.WriteLine("例外: {0}", ex.Message);
- client.Rollback();
- }
- }
- }
- public void Update(Product product)
- {
- using (IObjectContainer client = TestDataHelper.OpenClient())
- {
- Product r1 = _getByIdFromCache(product.Id);
- if (r1 == null)
- {
- Console.WriteLine("Update:該当データなし #1");
- return;
- }
- Product r2 = _getByProduct(client, r1);
- if (r2 == null)
- {
- Console.WriteLine("Update:該当データなし #2");
- return;
- }
- r2.Name = product.Name;
- r2.Price = product.Price;
- r2.Description = product.Description;
- try
- {
- client.Store(r2);
- client.Commit();
- }
- catch(Exception ex)
- {
- Console.WriteLine("例外: {0}", ex.Message);
- client.Rollback();
- }
- }
- }
- public void Remove(Product product)
- {
- using (IObjectContainer client = TestDataHelper.OpenClient())
- {
- Product r1 = _getByIdFromCache(product.Id);
- if (r1 == null)
- {
- Console.WriteLine("Remove:該当データなし #1");
- return;
- }
- Product r2 = _getByProduct(client, r1);
- if (r2 == null)
- {
- Console.WriteLine("Remove:該当データなし #2");
- return;
- }
- try
- {
- client.Delete(r2);
- client.Commit();
- }
- catch(Exception ex)
- {
- Console.WriteLine("例外: {0}", ex.Message);
- client.Rollback();
- }
- }
- }
- public void GetAll()
- {
- using (IObjectContainer client = TestDataHelper.OpenClient())
- {
- _cache = (from Product p in client
- orderby p.Id
- select p).ToList();
- foreach (Product p in _cache)
- {
- Console.WriteLine(p);
- }
- }
- }
- public void Dispose()
- {
- TestDataHelper.CloseServer();
- }
- private Product _getById(IObjectContainer client, int id)
- {
- return (from Product p in client
- where p.Id == id
- select p).SingleOrDefault();
- }
- private Product _getByIdFromCache(int id)
- {
- return (from Product p in _cache
- where p.Id == id
- select p).SingleOrDefault();
- }
- private Product _getByProduct(IObjectContainer client, Product product)
- {
- return (from Product p in client
- where p.Id == product.Id &&
- p.Name == product.Name &&
- p.Price == product.Price &&
- p.Description == product.Description
- select p).SingleOrDefault();
- }
- }
- }
[TestDataHelper.cs]
- using System;
- using System.Configuration;
- using Db4objects.Db4o;
- namespace db4oExample.TestData
- {
- public class TestDataHelper
- {
- private static IObjectServer _server;
- private static IObjectServer Server
- {
- get
- {
- if (_server == null)
- {
- string dbfile = ConfigurationManager.AppSettings["dbfile"];
- _server = Db4oFactory.OpenServer(dbfile, 0);
- }
- return _server;
- }
- }
- public static IObjectContainer OpenClient()
- {
- return Server.OpenClient();
- }
- public static void CloseServer()
- {
- if (Server != null)
- {
- Server.Close();
- }
- }
- }
- }
[ビルド実行例]
$ cd ~/src/cs/db4oExample
$ gmcs -t:library -r:System.Configuration.dll,Db4objects.Db4o.dll,Db4objects.Db4o.Linq.dll -out:./Test/db4oExample.dll Product.cs IProductRepository.cs -recurse:./TestData/*.cs
$ gmcs -t:library -r:System.Configuration.dll,Db4objects.Db4o.dll,Db4objects.Db4o.Linq.dll -out:./Test/db4oExample.dll Product.cs IProductRepository.cs -recurse:./TestData/*.cs
動作確認用プログラム
ProductRepositoryインスタンスを使用したDB操作を行います。[client.cs]
- using System;
- using db4oExample;
- using db4oExample.TestData;
- namespace db4oExample.Test
- {
- public class Client
- {
- public static void Main(string[] args)
- {
- using (IProductRepository products = new ProductRepository())
- {
- products.GetAll();
- string s = "";
- while(s != "5")
- {
- Console.WriteLine();
- Console.Write("1:ADD\n2:UPDATE\n3:REMOVE\n4:RELOAD\n5:EXIT\n?> ");
- s = Console.ReadLine();
- switch(s)
- {
- case "1": AddProduct(products); goto case "4"; // 追加
- case "2": UpdateProduct(products); goto case "4"; // 更新
- case "3": RemoveProduct(products); goto case "4"; // 削除
- case "4": products.GetAll(); goto default; // 再読込
- case "5": goto default; // 終了
- default : break;
- }
- }
- }
- }
- private static void AddProduct(IProductRepository products)
- {
- try
- {
- products.Add(CreateProduct());
- }
- catch(Exception ex)
- {
- Console.WriteLine("例外: {0}", ex.Message);
- }
- }
- private static void UpdateProduct(IProductRepository products)
- {
- try
- {
- products.Update(CreateProduct());
- }
- catch(Exception ex)
- {
- Console.WriteLine("例外: {0}", ex.Message);
- }
- }
- private static void RemoveProduct(IProductRepository products)
- {
- Console.Write("ID(int)?> ");
- string id = Console.ReadLine();
- try
- {
- Product product = new Product();
- product.Id = Int32.Parse(id);
- products.Remove(product);
- }
- catch(Exception ex)
- {
- Console.WriteLine("例外: {0}", ex.Message);
- }
- }
- private static Product CreateProduct()
- {
- Console.Write("ID(int)?> ");
- string id = Console.ReadLine();
- Console.Write("NAME(string)?> ");
- string name = Console.ReadLine();
- Console.Write("PRICE(num)?> ");
- string price = Console.ReadLine();
- Console.Write("DESCRIPTION(string)?> ");
- string description = Console.ReadLine();
- Product product = new Product();
- product.Id = Int32.Parse(id);
- product.Name = name;
- if (price != "")
- {
- product.Price = Decimal.Parse(price);
- }
- product.Description = description;
- return product;
- }
- }
- }
- /*
- * ビルド:
- *
- * gmcs -r:db4oExample.dll client.cs
- *
- * 実行:
- *
- * mono client.exe
- *
- */
[client.exe.config]
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <appSettings>
- <add key="dbfile" value="/home/sta/data/db4o/TestData.db4o" />
- </appSettings>
- </configuration>
[実行例]
$ cd ~/src/cs/db4oExample/Test
$ mono client.exe
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
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:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 1
ID(int)?> 2
NAME(string)?> test2
PRICE(num)?> 2.2
DESCRIPTION(string)?> for test2
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
ID:2 NAME:test2 PRICE:2.2 DESCRIPTION:for test2
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:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 2
ID(int)?> 2
NAME(string)?> Test2
PRICE(num)?> 2.22
DESCRIPTION(string)?> テスト2
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
ID:2 NAME:Test2 PRICE:2.22 DESCRIPTION:テスト2
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:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 3
ID(int)?> 2
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
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:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 5
$ mono client.exe
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
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:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 1
ID(int)?> 2
NAME(string)?> test2
PRICE(num)?> 2.2
DESCRIPTION(string)?> for test2
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
ID:2 NAME:test2 PRICE:2.2 DESCRIPTION:for test2
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:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 2
ID(int)?> 2
NAME(string)?> Test2
PRICE(num)?> 2.22
DESCRIPTION(string)?> テスト2
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
ID:2 NAME:Test2 PRICE:2.22 DESCRIPTION:テスト2
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:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 3
ID(int)?> 2
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
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:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 5
Monoで他のDBも使ってみたよ!+(db4o、NHibernate編)4 へ続く。
0 件のコメント:
コメントを投稿