土曜日, 2月 16, 2008

SQLite.NET DbProviderFactoriesについて

.netではapp.config(内容はXML)ってのを使うのが普通みたいですね。 SQLite.NETでも多聞に漏れずHelpの最初に 「DbProviderFactories」についての説明があります。 このFactoryを利用すれば、SQLiteに依存したクラスを使わなくても動作します。 app.configでの設定方法は2種類あるらしく、
  1. SQLiteバージョン非依存
  2. SQLiteバージョン依存
ちょっとづつだが、app.configの書き方が違う。 最初はよくわからんかったのだが、そういう時はTry and Errorに限りますね。 1については
<configuration>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite"/>
<add name="SQLite Data Provider" invariant="System.Data.SQLite"
    description=".Net Framework Data Provider for SQLite"
    type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
</configuration>
アプリケーションのフォルダ(VS2008で言ったらDebugモードでbin/debugの場所)にSystem.Data.SQLite.DLLを設置しないといけない。 2については
<configuration>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite"/>
<add name="SQLite Data Provider" invariant="System.Data.SQLite"
    description=".Net Framework Data Provider for SQLite"
    type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite"
    Version=1.0.48.0, Culture=neutral,
    PublicKeyToken=db937bc2d44ff139"/>
</DbProviderFactories>
</system.data>
</configuration>
この場合はアプリケーションのフォルダにdllを置く必要はないらしい。 addタグにVersion,Current,PublicKeyTokenの属性を付け足してやればグローバルキャッシュ?からdllをロードしてきてくれるみたい。。。 SQLite.NETの公式フォーラムで紹介されていたサンプルコードをSQLiteに依存しないクラスで書き換えてみた。 System.Data.Commonを使っています。
using System;
using System.Data.Common;

namespace Sample
{
  class Program
  {
      static void Main(string[] args)
      {
          DbProviderFactory fact = DbProviderFactories.GetFactory("System.Data.SQLite");
          using (DbConnection cnn = fact.CreateConnection())
          using (DbCommand cmd = cnn.CreateCommand())
          {
              cnn.ConnectionString = "Data Source=mydatabase.db";
              cnn.Open();

              // Create a new table
              cmd.CommandText = "CREATE TABLE FOO (ID INTEGER PRIMARY KEY, MyValue NVARCHAR(256))";
              cmd.ExecuteNonQuery(); // Create the table, don't expect returned data

              // Insert something into the table
              cmd.CommandText = "INSERT INTO FOO (MyValue) VALUES('Hello World')";
              cmd.ExecuteNonQuery();

              // Read the values back out
              cmd.CommandText = "SELECT * FROM FOO";
              using (DbDataReader reader = cmd.ExecuteReader())
              {
                  while (reader.Read())
                  {
                      Console.WriteLine(String.Format("ID = {0}, MyValue = {1}", reader[0], reader[1]));
                  }
              }
          }
      }
  }
}
どうにかして、dllが自動的にアプリケーションのところにコピーしてくれないもんか?と考えてます。(log4netのdllは勝手にコピーされてるみたいだし方法はあると思うんだけど。。。) あとは、もう少しなれたらLINQを試してみようと思う。

0 件のコメント:

failed to read qemu headerのときのメモ

かなり久々。。。 忘れないようにここに書きこんでおく。 ちょっとした手違いで libvirtでイメージを起動しようとすると failed to read qemu header なんておっしゃられて起動しない。。。 vmwareserverを使って...