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

わんくま同盟

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

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

ツリー一括表示

OLEDBでのMax Locks Per Fileの設定 /dekoderu (18/05/14(Mon) 17:50) #87353
Re[1]: OLEDBでのMax Locks Per Fileの設定 /魔界の仮面弁士 (18/05/14(Mon) 19:42) #87354
│└ Re[2]: OLEDBでのMax Locks Per Fileの設定 /dekoderu (18/05/15(Tue) 15:10) #87362
│  └ Re[3]: OLEDBでのMax Locks Per Fileの設定 /魔界の仮面弁士 (18/05/15(Tue) 18:00) #87371
│    └ Re[4]: OLEDBでのMax Locks Per Fileの設定 /dekoderu (18/05/16(Wed) 18:35) #87388 解決済み
Re[1]: OLEDBでのMax Locks Per Fileの設定 /PANG2 (18/05/15(Tue) 18:27) #87372
  └ Re[2]: OLEDBでのMax Locks Per Fileの設定 /dekoderu (18/05/16(Wed) 18:39) #87389 解決済み


親記事 / ▼[ 87354 ] ▼[ 87372 ]
■87353 / 親階層)  OLEDBでのMax Locks Per Fileの設定
□投稿者/ dekoderu (1回)-(2018/05/14(Mon) 17:50:41)

分類:[VB.NET/VB2005 以降] 

データベースをAccess、画面をVB.Net2008で作成しております。

大量のデータをインサートした際に、「ファイルの共有ロック数が制限を超えています」というエラーが発生したため、サイトを調べたところ
Max Locks Per Fileの設定を行えば回避できる方法がありました。
その方法で試してみたところ、「インストール可能な ISAM ドライバが見つかりませんでした。」というエラーが発生します。

以下コードです。
---------------------------------------------
Public oConn As New OleDbConnection
Public oCommand As New OleDbCommand

'DB接続文字列の設定
oConn.ConnectionString = "Provider="Microsoft.ACE.OLEDB.12.0;" & _
"Data Source="C:\Project\TEST.accdb;" & _
"Jet OLEDB:Database Password="TEST;" & _
"Jet OLEDB:Max Locks Per File=100000"

'コネクションの設定
oCommand.Connection = oConn
' 接続を開く
oConn.Open()
oCommand = oConn.CreateCommand()

---------------------------------------------

間違えているところなどありましたら
ご教授いただければと思います。
お手数をおかけしますが
よろしくお願いいたします。
[ □ Tree ] 返信 編集キー/

▲[ 87353 ] / ▼[ 87362 ]
■87354 / 1階層)  Re[1]: OLEDBでのMax Locks Per Fileの設定
□投稿者/ 魔界の仮面弁士 (1664回)-(2018/05/14(Mon) 19:42:20)
2018/05/14(Mon) 22:33:56 編集(投稿者)

No87353 (dekoderu さん) に返信
> データベースをAccess、画面をVB.Net2008で作成しております。
OLE DB Provider はインストール済みですか?
https://www.microsoft.com/ja-jp/download/details.aspx?id=13255
https://www.microsoft.com/en-us/download/details.aspx?id=54920


インストールしてある場合、32bit 版ですか? 64bit 版ですか?


アプリが AnyCPU ビルドの場合
 32bit 版 Windows では 32bit 版の OLE DB Provider が必要
 64bit 版 Windows では 64bit 版の OLE DB Provider が必要


アプリが x86 ビルドの場合
 32bit/64bit 版 Windows いずれにおいても、32bit 版の OLE DB Provider が必要


アプリが x64 ビルドの場合
 32bit 版 Windows では動作しない
 64bit 版 Windows では 64bit 版の OLE DB Provider が必要



> 大量のデータをインサートした際に、「ファイルの共有ロック数が制限を超えています」というエラーが発生したため、サイトを調べたところ
> Max Locks Per Fileの設定を行えば回避できる方法がありました。
"Max Locks Per File" ではなく、提示コードにあるとおり、
"Jet OLEDB:Max Locks Per File" ですね。
ちなみに初期値は 0 、既定値は 9500 です。

https://msdn.microsoft.com/en-us/library/ms719649.aspx
https://msdn.microsoft.com/ja-jp/library/office/jj249228.aspx



> Public oCommand As New OleDbCommand
最初に New してインスタンスを生成し、

> oCommand.Connection = oConn
そこに Connection をセットまでしたのに

> oCommand = oConn.CreateCommand()
新たに生成した OleDbCommand のインスタンスで上書きしているのは何故でしょう?
[ 親 87353 / □ Tree ] 返信 編集キー/

▲[ 87354 ] / ▼[ 87371 ]
■87362 / 2階層)  Re[2]: OLEDBでのMax Locks Per Fileの設定
□投稿者/ dekoderu (2回)-(2018/05/15(Tue) 15:10:54)
No87354 (魔界の仮面弁士 さん) に返信

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


> 2018/05/14(Mon) 22:33:56 編集(投稿者)
>
> ■No87353 (dekoderu さん) に返信
>>データベースをAccess、画面をVB.Net2008で作成しております。
> OLE DB Provider はインストール済みですか?
> https://www.microsoft.com/ja-jp/download/details.aspx?id=13255
> https://www.microsoft.com/en-us/download/details.aspx?id=54920
>
>
> インストールしてある場合、32bit 版ですか? 64bit 版ですか?

インストール済みです。
32bit版です。

>
>
> アプリが AnyCPU ビルドの場合
>  32bit 版 Windows では 32bit 版の OLE DB Provider が必要
>  64bit 版 Windows では 64bit 版の OLE DB Provider が必要
>
>
> アプリが x86 ビルドの場合
>  32bit/64bit 版 Windows いずれにおいても、32bit 版の OLE DB Provider が必要
>
>
> アプリが x64 ビルドの場合
>  32bit 版 Windows では動作しない
>  64bit 版 Windows では 64bit 版の OLE DB Provider が必要
>

アプリはx86ビルドになっております。

>
>
>>大量のデータをインサートした際に、「ファイルの共有ロック数が制限を超えています」というエラーが発生したため、サイトを調べたところ
>>Max Locks Per Fileの設定を行えば回避できる方法がありました。
> "Max Locks Per File" ではなく、提示コードにあるとおり、
> "Jet OLEDB:Max Locks Per File" ですね。
> ちなみに初期値は 0 、既定値は 9500 です。
>
> https://msdn.microsoft.com/en-us/library/ms719649.aspx
> https://msdn.microsoft.com/ja-jp/library/office/jj249228.aspx
>
>
>
>>Public oCommand As New OleDbCommand
> 最初に New してインスタンスを生成し、
>
>>oCommand.Connection = oConn
> そこに Connection をセットまでしたのに
>
>>oCommand = oConn.CreateCommand()
> 新たに生成した OleDbCommand のインスタンスで上書きしているのは何故でしょう?

プログラムの作成者が退職しているため
なぜそのようになっているのかがすぐにわかりませんでした。

oCommand = oConn.CreateCommand()を削除しても
エラーが発生しました。
Jet OLEDB:Max Locks Per File=100000の
記述を追加する前はエラーが発生しないため、
記述に誤りがあるのか、そもそもOLEDBでは
Max Locks Per Fileが設定できないとか
あるんですかね・・・





[ 親 87353 / □ Tree ] 返信 編集キー/

▲[ 87362 ] / ▼[ 87388 ]
■87371 / 3階層)  Re[3]: OLEDBでのMax Locks Per Fileの設定
□投稿者/ 魔界の仮面弁士 (1666回)-(2018/05/15(Tue) 18:00:56)
No87362 (dekoderu さん) に返信
> oCommand = oConn.CreateCommand()を削除しても
> エラーが発生しました。
まぁ、そもそも提示のコードだと、構文エラーになるはずなんですけれどね。
『"』が奇数個になっていますし。


> Jet OLEDB:Max Locks Per File=100000の
> 記述を追加する前はエラーが発生しないため、

上記エントリを含めると、当方でも駄目でした。
当方で利用したプロバイダは下記の通り。
 64bit Microsoft.ACE.OLEDB.15.0
 64bit Microsoft.ACE.OLEDB.12.0
 32bit Microsoft.Jet.OLEDB.4.0
 32bit Microsoft.Jet.OLEDB.3.51


代わりに、Jet OLEDB:Registry Path を通じて設定するようにしてみてください。

oConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
  "Data Source=""C:\temp\db1.accdb"";" & _
  "Jet OLEDB:Registry Path=SOFTWARE\MyCorporation\MyApplication\1.0"

あるいは、アプリ固有のカスタムエントリを作る代わりに、
KB815281 の「方法 1」のように、HKLM 側の システム全体設定で
指定することもできるかと思います。



> 記述に誤りがあるのか、そもそもOLEDBでは
> Max Locks Per Fileが設定できないとか
> あるんですかね・・・

KB815281 の「方法 2」でも示されていますが、DAO 接続時には設定できるようです。
(有効になっているかは判断できませんでしたが)

Dim de As New Dao.DBEngine()
de.SetOption(Dao.SetOptionEnum.dbMaxLocksPerFile, 100000)
Dim db As Dao.Database = de.OpenDatabase("C:\temp\db1.accdb")
db.Close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(db)
System.Runtime.InteropServices.Marshal.ReleaseComObject(de)


Jet OLEDB:Max Locks Per File については、ADO.NET どころか、
ADO でさえ弾かれました。.NET はおろか、Access VBA からも駄目。

それどころか、JET 4.0 / Jet 3.51 プロバイダでも設定できませんでした。
MDAC 2.5 の頃に実験した時は設定できた気もするのですが…自信なし。
http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_41433_0.html
[ 親 87353 / □ Tree ] 返信 編集キー/

▲[ 87371 ] / 返信無し
■87388 / 4階層)  Re[4]: OLEDBでのMax Locks Per Fileの設定
□投稿者/ dekoderu (4回)-(2018/05/16(Wed) 18:35:28)
2018/05/16(Wed) 18:41:11 編集(投稿者)

No87371 (魔界の仮面弁士 さん) に返信

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


> ■No87362 (dekoderu さん) に返信
>>oCommand = oConn.CreateCommand()を削除しても
>>エラーが発生しました。
> まぁ、そもそも提示のコードだと、構文エラーになるはずなんですけれどね。
> 『"』が奇数個になっていますし。
>

『"』の記述を間違えて投稿してしまっていました。
実際に動いているソースコードでは構文エラーが発生しないようになっています。
お手数をおかけしました。


>
>>Jet OLEDB:Max Locks Per File=100000の
>>記述を追加する前はエラーが発生しないため、
>
> 上記エントリを含めると、当方でも駄目でした。
> 当方で利用したプロバイダは下記の通り。
>  64bit Microsoft.ACE.OLEDB.15.0
>  64bit Microsoft.ACE.OLEDB.12.0
>  32bit Microsoft.Jet.OLEDB.4.0
>  32bit Microsoft.Jet.OLEDB.3.51
>
>
> 代わりに、Jet OLEDB:Registry Path を通じて設定するようにしてみてください。
>
> oConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
>   "Data Source=""C:\temp\db1.accdb"";" & _
>   "Jet OLEDB:Registry Path=SOFTWARE\MyCorporation\MyApplication\1.0"
>
> あるいは、アプリ固有のカスタムエントリを作る代わりに、
> KB815281 の「方法 1」のように、HKLM 側の システム全体設定で
> 指定することもできるかと思います。

Registry Pathを使用してできるんですね。
対応を検討したいと思います。


>
>
>
>>記述に誤りがあるのか、そもそもOLEDBでは
>>Max Locks Per Fileが設定できないとか
>>あるんですかね・・・
>
> KB815281 の「方法 2」でも示されていますが、DAO 接続時には設定できるようです。
> (有効になっているかは判断できませんでしたが)
>
> Dim de As New Dao.DBEngine()
> de.SetOption(Dao.SetOptionEnum.dbMaxLocksPerFile, 100000)
> Dim db As Dao.Database = de.OpenDatabase("C:\temp\db1.accdb")
> db.Close()
> System.Runtime.InteropServices.Marshal.ReleaseComObject(db)
> System.Runtime.InteropServices.Marshal.ReleaseComObject(de)
>
>
> Jet OLEDB:Max Locks Per File については、ADO.NET どころか、
> ADO でさえ弾かれました。.NET はおろか、Access VBA からも駄目。
>
> それどころか、JET 4.0 / Jet 3.51 プロバイダでも設定できませんでした。
> MDAC 2.5 の頃に実験した時は設定できた気もするのですが…自信なし。
> http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_41433_0.html


詳しく調査していただきありがとうございました。
大変助かりました。



解決済み
[ 親 87353 / □ Tree ] 返信 編集キー/

▲[ 87353 ] / ▼[ 87389 ]
■87372 / 1階層)  Re[1]: OLEDBでのMax Locks Per Fileの設定
□投稿者/ PANG2 (7回)-(2018/05/15(Tue) 18:27:31)
2018/05/15(Tue) 19:00:00 編集(投稿者)

Access 実行時エラー 3052 解決方法 コミットせよ
http://motagp.hatenablog.com/entry/2015/05/22/111246

close/openでも良いかも
[ 親 87353 / □ Tree ] 返信 編集キー/

▲[ 87372 ] / 返信無し
■87389 / 2階層)  Re[2]: OLEDBでのMax Locks Per Fileの設定
□投稿者/ dekoderu (5回)-(2018/05/16(Wed) 18:39:33)
2018/05/16(Wed) 18:41:34 編集(投稿者)
No87372 (PANG2 さん) に返信

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

> 2018/05/15(Tue) 19:00:00 編集(投稿者)
>
> Access 実行時エラー 3052 解決方法 コミットせよ
> http://motagp.hatenablog.com/entry/2015/05/22/111246
>
> close/openでも良いかも

URLの内容を確認いたしました。
対応を検討いたします。

解決済み
[ 親 87353 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -