.netではapp.config(内容はXML)ってのを使うのが普通みたいですね。
SQLite.NETでも多聞に漏れずHelpの最初に
「DbProviderFactories」についての説明があります。
このFactoryを利用すれば、SQLiteに依存したクラスを使わなくても動作します。
app.configでの設定方法は2種類あるらしく、
- SQLiteバージョン非依存
- 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 件のコメント:
コメントを投稿