■
↓【db4o】の公式ページ
http://www.db4o.com/japan/Default.aspx
オブジェクトデータベースということで、C#のオブジェクト(インスタンス)をそのまま、
データベースに保存・読み出しできます。
ためしにWebBrowserコンポーネントをデータベースに保存・読み出ししてみました。
が、WebBrowserコンポーネントは中身はCOMなので、保存時に例外が発生しました。
でも、WebBrowserコンポーネントには、DocumentStreamプロパティがありましたので、
これを利用するよう、まず、以下のdocクラスを作成しました。
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using mshtml; using System.IO; namespace cstest1 { public class doc { private static int id = 0; private int id_ = 0; private StreamReader a_ = null; private MemoryStream ms_ = null; private string url_ = null; public doc( StreamReader s,MemoryStream ms, string url ) { this.a_ = s; this.ms_ = ms; doc.id++; this.id_ = doc.id; this.url_ = url; } public int ID { get { return this.id_; } } public string URL { get { return this.url_; } } public MemoryStream getStream() { return this.ms_; } } }
で、次に、docクラスをdb4oに保存するフォームを以下のように作成しました。
(コメントアウトがありますが、試行錯誤のあとなので、無視してください)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Db4objects.Db4o; using System.IO; namespace cstest1 { public partial class Form1 : Form { //public Stream ddd = null; //private DataTable dt = new DataTable(); private ListdocCollection = null; public Form1() { InitializeComponent(); //this.dt.Columns.Add(new DataColumn("url", typeof(string))); //this.dt.Columns.Add(new DataColumn("id", typeof(int))); } private void button1_Click(object sender, EventArgs e) { web1.Navigate("http://www.yahoo.co.jp"); //HtmlDocument doc = web1.Document; } private void button2_Click(object sender, EventArgs e) //■docを保存■ { //HtmlDocument d = web1.Document; IObjectContainer dba = Db4objects.Db4o.Db4oFactory.OpenFile("test.db"); Stream documentStream = web1.DocumentStream; MemoryStream memoryStream = new MemoryStream(); byte byteBuf = new byte[4096]; int bytes = 0; while ((bytes = documentStream.Read(byteBuf, 0, 4096) )> 0) { memoryStream.Write(byteBuf, 0, bytes); } memoryStream.Position = 0; //this.ddd = memoryStream; StreamReader tmpStream = new StreamReader(memoryStream); tmpStream.ReadToEnd(); memoryStream.Position = 0; doc tmpDoc = new doc(tmpStream,memoryStream,web1.Url.ToString()); /* DataRow row = this.dt.NewRow(); row["url"] = web1.Url.ToString(); row["id"] = tmpDoc.ID; this.dt.Rows.Add(row); */ /* int i = 1; doc docobj = new doc(); docobj.AA = d.IHTML; coc c = new coc(d.Cookie); */ try { //dba.Set(tmpStream); dba.Set(tmpDoc); //dba.Set(memoryStream); } catch (Exception excp) { MessageBox.Show(excp.ToString()); } finally { dba.Close(); } } private void button3_Click(object sender, EventArgs e) //■docを読み込み■ { IObjectContainer dba = Db4objects.Db4o.Db4oFactory.OpenFile("test.db"); doc tmpDoc = null; IList docs = null; try { docs = dba.Query buf = new byte[4096]; int bytes = 0; while *1 > 0) { ms.Read(buf, 0, bytes); } */ } private void button4_Click(object sender, EventArgs e) { web1.Navigate("file:///c:/aaa.txt"); } private void button5_Click(object sender, EventArgs e) //■ついでに、DataGridViewに表示■ { this.dataGridView1.AutoGenerateColumns = true; //this.dataSet1.Tables.Add(this.dt); this.bindingSource1.DataSource = this.docCollection; //■List( //■db4oのマニュアル参照。Native Query。といっても単なる匿名メソッド(無名デリゲート)■ delegate(cstest1.doc oneDoc) //■検索条件。ここでは、ID==1のdocの場合のみdelegateがtrueをreturnするので、ID==1のdocのみ抽出される。■ { return oneDoc.ID == 1; //■ここをカスタマイズする。たとえば、return true;にすると、全docオブジェクトが抽出される。■ }); if (!(docs.Count == 0)) { this.docCollection = new List (docs); tmpDoc = docs[0]; } } catch (Exception excp) { MessageBox.Show(excp.ToString()); } finally { dba.Close(); } Stream memoryStream = web1.DocumentStream; //Stream ss = this.ddd; Stream stream = tmpDoc.getStream(); //■ここは注意。Streamのデータポインタは保存時にデータの最後になっていてそのまま保存されてしまって■ //■いるため、ここでデータポインタを0に初期化し、データの先頭を指すようにする■ //■(ここで0にしないと、WebBrowserコンポーネントはなにも表示しない)■ stream.Position = 0; web1.DocumentStream = stream; //■コレだけで、WebBrowserに元のWebページが再現■ //web1.DocumentStream = this.ddd; /* ss.Position = 0; byte をbindingDatasourceに与えると、データソースになる■ //this.dataGridView1.DataSource = this.dataSet1; this.dataGridView1.DataSource = this.bindingSource1; //■ややこしいけど、DataGridViewのデータソースはbindingDatasourceにする■ this.dataGridView1.AutoResizeColumns( DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader); } } }
*1:bytes = ss.Read(buf, 0, 4096