■ ListBoxのデータの並びを降順にする
ListBoxを昇順にするには、
ListBox.Sorted = True
降順にするには・・・
ListBox.Sorted = True '昇順に並べる
ArrayList.Adapter(ListBox.Items).Reverse() '値を反転(降順)
ListBox.Sorted = False '値が昇順にならないようにする
参考:http://hanatyan.sakura.ne.jp/dotnet/list02.htm#no7
値が多くなると遅くなるらしいので、どうしたものか・・・。
■ OleDBを使ったトランザクション処理
参考:http://msdn.microsoft.com/ja-jp/library/aa325885(v=VS.71).aspx
大体この辺のやり方でトランザクション処理を作り、更新ロックをかけてみたら、
エラー「分離レベルおよびその強化はサポートされていません。」
調べてみると、Jet.OLEDB.4.0プロバイダのトランザクション分離レベルについて、
参考:http://d.hatena.ne.jp/hilapon/20100701/1277984287
上記サイト抜粋
「Jet 4.0 OLE DB プロバイダ で MDB ファイルに接続した場合、トランザクション分離レベルで指定できるのは、
IsolationLevel.ReadUncommitted か IsolationLevel.ReadCommitted の二種類のみ可能なようです。」
「RepeatableRead や Serializable を指定すると、System.Data.OleDb.OleDbException
"分離レベルおよびその強化はサポートされていません。"」
Serializable がしたいんですけどっ・・。
■ Jet 4.0 OLE DB で更新ロック
Oledbでの更新ロックができないとわかり、常套句のFor Updateでもしちゃおうかな、と思ったら、
Accessにはありません・・・。
ええっ、と思ったが、ロックかけるほど大規模なのってAccess使わないっしょ、という、
調べた掲示板の書き込みに、うなずいてしまった。。
おお、どうしよう・・・って事で粘ってみた。
Accessにだってロック機能はある、はず。ありました。
参考:http://msdn.microsoft.com/ja-jp/library/cc426819.aspx
↑ プロバイダ固有の接続パラメータにある、
「Jet OLEDB:Database Locking Mode」
ページロックがJet OLEDB:Database Locking Mode = 0
行ロックが Jet OLEDB:Database Locking Mode = 1
この設定は、Openすると変えられない、らしい。
(一部参考:http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200509/200509_05090130.html)
パラメータ説明はここ:http://msdn.microsoft.com/ja-jp/library/dd263027.aspx
だが、書き方がわからず手間取る・・・。
とりあえず、OleDbConnectionStringBuilder クラスの説明で、たまたまこのロック制御をしている例文が有ったので、
参考:http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbconnectionstringbuilder.aspx
そこのソースをデバッグで実行して、BuilderのConnectionStringを見る、という強行手段。
";Jet OLEDB:Database Locking Mode=1"
これを、ConnectionのConectionStringsに追加する。
さて、デバッグ状態で接続、テーブル開いたところまで行き、Accessからテーブル更新してみる。
普通はできないはず・・・できます。ロックしてない・・・?
Accessコンソールでやってるから意味無いのか??
と思い、別のプロジェクトからつないだり更新してみると、できる。
やはりロックされていない。。。泣けてきた。
???と悩み、時間を無駄にしながら下記サイトの記述が気になる。
http://msdn.microsoft.com/ja-jp/library/cc376645.aspx
「Microsoft Jet 4.0 OLE DB Provider で ADO を使用し、Access データベースで作業する場合は、
データベースを開く前に Connection オブジェクトにあるプロバイダ特定の
Jet OLEDB:Database Locking Mode プロパティを設定し」
「次に SQL DML ステートメントの実行、または Recordset オブジェクトを開く/返すメソッドに使用する
Recordset オブジェクトのプロバイダ特定の Granularity プロパティを設定します。」
ってな事で、Granularityプロパティを調べる。
設定方法は、
objRecordset.Properties("Jet OLEDB:Locking Granularity").Value = 2
(1がページロックで2が行ロック)
参考:http://www.gizcollabo.jp/vbtomo/log/archive/vbdatabase_1483_0.html
んで、今回使っているのが、OleDb.OleDbDataReader。
どーやって設定すんの・・・?
で、挫折。。。
Locking ModeみたいにConnectionStringに直接入れてみたが、エラー。
今回ばかりはGoogle先生も教えてくれない。
ただ、http://msdn.microsoft.com/ja-jp/library/cc426819.aspxをじっくり読んでいると、
:Locking GranularityとLocking Modeはパラメータだが、使いどころが違うらしい。
Locking Modeは、
「Connection オブジェクトの Properties コレクションで設定するか、
接続文字列の一部として設定することができます。」
だが、Locking Granularityは、
「Recordset および Command に関するプロバイダ固有の各種プロパティをサポート」で
「プロパティの取得および設定は、Recordset オブジェクトまたは Command オブジェクトの
Properties コレクションを通 して行います。」
思っているものとは違うらしいし、ConnectionStringに設定するものでもないらしい。。
参考:http://bbs.wankuma.com/index.cgi?mode=al2&namber=18719&KLOG=36
この期に及んで、ADODB.Recordsetを使うの??
接続から全て変更しなければ 。゜(゜´Д`゜)ノ。。
まあ・・・行ロック用のフィールド追加してしまったほうが早いか・・・。
ListBoxを昇順にするには、
ListBox.Sorted = True
降順にするには・・・
ListBox.Sorted = True '昇順に並べる
ArrayList.Adapter(ListBox.Items).Reverse() '値を反転(降順)
ListBox.Sorted = False '値が昇順にならないようにする
参考:http://hanatyan.sakura.ne.jp/dotnet/list02.htm#no7
値が多くなると遅くなるらしいので、どうしたものか・・・。
■ OleDBを使ったトランザクション処理
参考:http://msdn.microsoft.com/ja-jp/library/aa325885(v=VS.71).aspx
大体この辺のやり方でトランザクション処理を作り、更新ロックをかけてみたら、
エラー「分離レベルおよびその強化はサポートされていません。」
調べてみると、Jet.OLEDB.4.0プロバイダのトランザクション分離レベルについて、
参考:http://d.hatena.ne.jp/hilapon/20100701/1277984287
上記サイト抜粋
「Jet 4.0 OLE DB プロバイダ で MDB ファイルに接続した場合、トランザクション分離レベルで指定できるのは、
IsolationLevel.ReadUncommitted か IsolationLevel.ReadCommitted の二種類のみ可能なようです。」
「RepeatableRead や Serializable を指定すると、System.Data.OleDb.OleDbException
"分離レベルおよびその強化はサポートされていません。"」
Serializable がしたいんですけどっ・・。
■ Jet 4.0 OLE DB で更新ロック
Oledbでの更新ロックができないとわかり、常套句のFor Updateでもしちゃおうかな、と思ったら、
Accessにはありません・・・。
ええっ、と思ったが、ロックかけるほど大規模なのってAccess使わないっしょ、という、
調べた掲示板の書き込みに、うなずいてしまった。。
おお、どうしよう・・・って事で粘ってみた。
Accessにだってロック機能はある、はず。ありました。
参考:http://msdn.microsoft.com/ja-jp/library/cc426819.aspx
↑ プロバイダ固有の接続パラメータにある、
「Jet OLEDB:Database Locking Mode」
ページロックがJet OLEDB:Database Locking Mode = 0
行ロックが Jet OLEDB:Database Locking Mode = 1
この設定は、Openすると変えられない、らしい。
(一部参考:http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200509/200509_05090130.html)
パラメータ説明はここ:http://msdn.microsoft.com/ja-jp/library/dd263027.aspx
だが、書き方がわからず手間取る・・・。
とりあえず、OleDbConnectionStringBuilder クラスの説明で、たまたまこのロック制御をしている例文が有ったので、
参考:http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbconnectionstringbuilder.aspx
そこのソースをデバッグで実行して、BuilderのConnectionStringを見る、という強行手段。
";Jet OLEDB:Database Locking Mode=1"
これを、ConnectionのConectionStringsに追加する。
さて、デバッグ状態で接続、テーブル開いたところまで行き、Accessからテーブル更新してみる。
普通はできないはず・・・できます。ロックしてない・・・?
Accessコンソールでやってるから意味無いのか??
と思い、別のプロジェクトからつないだり更新してみると、できる。
やはりロックされていない。。。泣けてきた。
???と悩み、時間を無駄にしながら下記サイトの記述が気になる。
http://msdn.microsoft.com/ja-jp/library/cc376645.aspx
「Microsoft Jet 4.0 OLE DB Provider で ADO を使用し、Access データベースで作業する場合は、
データベースを開く前に Connection オブジェクトにあるプロバイダ特定の
Jet OLEDB:Database Locking Mode プロパティを設定し」
「次に SQL DML ステートメントの実行、または Recordset オブジェクトを開く/返すメソッドに使用する
Recordset オブジェクトのプロバイダ特定の Granularity プロパティを設定します。」
ってな事で、Granularityプロパティを調べる。
設定方法は、
objRecordset.Properties("Jet OLEDB:Locking Granularity").Value = 2
(1がページロックで2が行ロック)
参考:http://www.gizcollabo.jp/vbtomo/log/archive/vbdatabase_1483_0.html
んで、今回使っているのが、OleDb.OleDbDataReader。
どーやって設定すんの・・・?
で、挫折。。。
Locking ModeみたいにConnectionStringに直接入れてみたが、エラー。
今回ばかりはGoogle先生も教えてくれない。
ただ、http://msdn.microsoft.com/ja-jp/library/cc426819.aspxをじっくり読んでいると、
:Locking GranularityとLocking Modeはパラメータだが、使いどころが違うらしい。
Locking Modeは、
「Connection オブジェクトの Properties コレクションで設定するか、
接続文字列の一部として設定することができます。」
だが、Locking Granularityは、
「Recordset および Command に関するプロバイダ固有の各種プロパティをサポート」で
「プロパティの取得および設定は、Recordset オブジェクトまたは Command オブジェクトの
Properties コレクションを通 して行います。」
思っているものとは違うらしいし、ConnectionStringに設定するものでもないらしい。。
参考:http://bbs.wankuma.com/index.cgi?mode=al2&namber=18719&KLOG=36
この期に及んで、ADODB.Recordsetを使うの??
接続から全て変更しなければ 。゜(゜´Д`゜)ノ。。
まあ・・・行ロック用のフィールド追加してしまったほうが早いか・・・。