C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: C# & SQLite /transactio


(過去ログ 14 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■4858 / inTopicNo.1)  C# & SQLite /transactionするには?
  
□投稿者/ kaburk (1回)-(2007/06/27(Wed) 19:07:46)

分類:[C# (Windows)] 

Visual C# 2005 Express Edition にて ADO.NET 2.0 Provider for SQLite(http://sqlite.phxsoftware.com/)を利用しています。

TableAdapterにてINSERTやupdateするとどうも更新が遅いので、Googleで調べたら

> http://journal.mycom.co.jp/special/2004/php5/007.html
> SQLiteでは明示的にトランザクションを開始しない限り、INSERT処理の前後に必ず"BEGIN"、"COMMIT"が実行される。

とのことでした。

C#でこれを回避したいのですが、どんな感じのやり方でコーディングしたらいいんでしょうか??

トランザクション管理に System.Transactions というのがあるようで、試しに
http://www.microsoft.com/japan/msdn/thisweek/300x10/phase3/Transaction_Scope/cs.aspx
を参考に適用してみました。
が、トランザクションは発行されているみたいですが、いざDataSetからGetData等すると「'System.Data.SQLite.SQLiteException' の初回例外が System.Data.SQLite.dll で発生しました。」「The database file is locked」「database is locked」となってしまい、どうしたもんだか、という感じです。

アドバイスいただけたら幸いです。
引用返信 編集キー/
■4899 / inTopicNo.2)  Re[1]: C# & SQLite /transactionするには?
□投稿者/ はつね (190回)-(2007/06/28(Thu) 10:46:04)
はつね さんの Web サイト
No4858 (kaburk さん) に返信
>>http://journal.mycom.co.jp/special/2004/php5/007.html
>>SQLiteでは明示的にトランザクションを開始しない限り、INSERT処理の前後に必ず"BEGIN"、"COMMIT"が実行される。
> とのことでした。
> C#でこれを回避したいのですが、どんな感じのやり方でコーディングしたらいいんでしょうか??

ADO.NET 2.0 Provider for SQLiteにはTransactionないの?


> トランザクション管理に System.Transactions というのがあるようで、試しに

これはMS-DTCを使ったものですから、SQLiteが対応していないとダメですね。対応しているの?

引用返信 編集キー/
■4956 / inTopicNo.3)  Re[2]: C# & SQLite /transactio
□投稿者/ kaburk (2回)-(2007/06/29(Fri) 13:42:27)
2007/06/29(Fri) 13:48:27 編集(投稿者)
No4899 (はつね さん) に返信

返信ありがとうございます。

> ADO.NET 2.0 Provider for SQLiteにはTransactionないの?

Transactionはあるので、TableAdapterから利用したいという訳です。

色々調べて
http://www.ailight.jp/blog/unaap/archive/2007/02/13/13566.aspx
という記述を見つけたので、C#&SQLiteへ変換して試してみました。

変換したソースはこちらです。
http://www5.uploader.jp/dl/kaburk/kaburk_uljp00002.zip.html

しかし、動きそうでどうにも動かない。

>    private SQLiteDataAdapter GetAdapter(object tableAdapter)
>    {
>        Type type = tableAdapter.GetType();
>        PropertyInfo adapterProperty = type.GetProperty("_adapter", BindingFlags.NonPublic | BindingFlags.Instance);
>        SQLiteDataAdapter adapter = (SQLiteDataAdapter)adapterProperty.GetValue(tableAdapter, null);
>        return adapter;
>    }

上記の関数にて _adapter が取得できないようです。
「オブジェクト参照がオブジェクトインスタンスに設定されていません。」となりnullになってしまって。何故だろう。
GetProperty出来ない理由を何方かご存知ありませんでしょうか?

とりあえず_adapter を Adapter とすると取得できるのですが

>    private void SetAdapter(object tableAdapter, SQLiteDataAdapter adapter)
>    {
>        Type type = tableAdapter.GetType();
>        PropertyInfo adapterProperty = type.GetProperty("Adapter", BindingFlags.NonPublic | BindingFlags.Instance);
>        adapterProperty.SetValue(tableAdapter, adapter, null);
>    }

にて、「Property Setメソッドが見つかりません。」エラーです。読取専用なんですかね。

>>トランザクション管理に System.Transactions というのがあるようで、試しに
> これはMS-DTCを使ったものですから、SQLiteが対応していないとダメですね。対応しているの?

対応しているかどうかは不明ですが、 MS-DTCは使わない方向で考えていこうと思います。

ということでまだ解決に至ってないんですが、少し先が見えてきました。
引き続き何方かご教授お願いします。

引用返信 編集キー/
■4959 / inTopicNo.4)  Re[3]: C# & SQLite /transactio
□投稿者/ kaburk (3回)-(2007/06/29(Fri) 14:09:55)
2007/06/29(Fri) 14:10:04 編集(投稿者)

No4956 (kaburk さん) に返信

自己解決しました。
どうやらPropertyではなくFieldのようでした。
お騒がせしました。

> private void SetAdapter(object tableAdapter, SQLiteDataAdapter adapter)
> {
> Type type = tableAdapter.GetType();
> FieldInfo adapterField = type.GetField("_adapter", BindingFlags.NonPublic | BindingFlags.Instance);
> adapterField.SetValue(tableAdapter, adapter);
> //PropertyInfo adapterProperty = type.GetProperty("Adapter", BindingFlags.NonPublic | BindingFlags.Instance);
> //adapterProperty.SetValue(tableAdapter, adapter, null);
> }
>
> private SQLiteDataAdapter GetAdapter(object tableAdapter)
> {
> Type type = tableAdapter.GetType();
> FieldInfo adapterField = type.GetField("_adapter", BindingFlags.NonPublic | BindingFlags.Instance);
> SQLiteDataAdapter adapter = (SQLiteDataAdapter)adapterField.GetValue(tableAdapter);
> //PropertyInfo adapterProperty = type.GetProperty("Adapter", BindingFlags.NonPublic | BindingFlags.Instance);
> //SQLiteDataAdapter adapter = (SQLiteDataAdapter)adapterProperty.GetValue(tableAdapter, null);
> return adapter;
> }

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -