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

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

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

Re[3]: VB.NETでエクセルを使ったADOデータベース処理


(過去ログ 96 を表示中)

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

■57442 / inTopicNo.1)  VB.NETでエクセルを使ったADOデータベース処理
  
□投稿者/ ふく (1回)-(2011/02/27(Sun) 10:37:20)

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

こんにちは

開発環境はVB.NET2005 WINXP Excel2007です。
プログラムしているところで、行き詰ってしまいました。
試行錯誤してみたのですがどうにもうまくいきません。
どうか、よろしくお願いいたします。
タイトルのようにVB.NETでエクセルを使ったADOデータベース処理を行っています。
うまくいかなくなったのは読み取りパスワード付きのエクセルファイルを開いて、処理するようにしてからです。パスワードがかかっている場合、一度、同ファイルをopen(ブックを非表示で)しておいてからデータベース参照をしなくてはならないようです。
しかしこの実行前にopenするエクセルデバックする前にエクセルが一つでも開いていると、そちらのエクセルのウィンドウ(グループ)にデータベースの参照がいってしまい、読み取り専用で2重に開かれてしまいます。何とか実行前に開いているエクセルのほうに処理が行ってしまわないようにしたいのですが。
以下の例ようにコーディングしました。

Dim xlApp As New Microsoft.Office.Interop.Excel.Application 'エクセルデータ用
Dim xlBooks As Microsoft.Office.Interop.Excel.Workbooks
Dim xlbook As Microsoft.Office.Interop.Excel.Workbook
Dim Filename ,Sheetname As String
Dim cnn As New System.Data.OleDb.OleDbConnection
Dim cmm As New System.Data.OleDb.OleDbCommand
Dim daa As New System.Data.OleDb.OleDbDataAdapter
Dim dss As New DataSet

xlBooks = xlApp.Workbooks
xlbook = xlBooks.Open("c:\test.xls", , , , "1234")'事前にopenする
FileName = System.IO.Path.Combine("c:\test.xls")
'データベースに接続するための情報を設定
cnn.ConnectionString = "provider=Microsoft.jet.OLEDB.4.0;Data source=" & FileName & ";Extended properties=""Excel 8.0;HDR=YES;IMEX=1"""
'コネクションの設定
cmm.Connection = cnn
'Excelファイルのシート名を設定
SheetName = "Sheet1"
'データソースで実行するSQL文の設定
cmm.CommandText = "select * from [" & SheetName & "$]"
daa.SelectCommand = cmm
daa = New System.Data.OleDb.OleDbDataAdapter(cmm)
dss = New System.Data.DataSet
'データを取得
daa.Fill(dss)


以上です。
よろしくお願いいたします。
引用返信 編集キー/
■57443 / inTopicNo.2)  Re[1]: VB.NETでエクセルを使ったADOデータベース処理
□投稿者/ 魔界の仮面弁士 (2111回)-(2011/02/27(Sun) 12:01:47)
No57442 (ふく さん) に返信
> VB.NETでエクセルを使ったADOデータベース処理を行っています。
これは ADO ではなく、ADO.NET のコードなのでは?


> パスワードがかかっている場合、一度、同ファイルをopen(ブックを非表示で)しておいてから
> データベース参照をしなくてはならないようです。
このあたりは JET I-ISAM の仕様ですね。そもそも、裏で開いておけば読み込めるというのも
ある意味、裏技的な動作だったりはするのですが。


> 何とか実行前に開いているエクセルのほうに処理が行ってしまわないようにしたいのですが。
あまり有効な方法は思いつかないのですが:

(案1) ROT 経由で、c:\test.xls を開いている Excel インスタンスを調べ、
 それらを事前に閉じてから操作する。
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=10322

(案2) C:\test.xls を直接開くのではなく、一時フォルダーに別名でコピーし、
 コピーしたファイルを New Excel.Application() + JET プロバイダで読み込む。

(案3) Microsoft.Jet.OLEDB.4.0 や Microsoft.ACE.OLEDB.12.0 での取り込みは諦めて、
 Excel オートメーションで Range オブジェクト経由にてデータを取り出すようにする。
引用返信 編集キー/
■57444 / inTopicNo.3)  Re[2]: VB.NETでエクセルを使ったADOデータベース処理
□投稿者/ ふく (2回)-(2011/02/27(Sun) 17:06:47)
魔界の仮面弁士 さん、ありがとうございます。


> これは ADO ではなく、ADO.NET のコードなのでは?
そうです。すみません。

> (案1) ROT 経由で、c:\test.xls を開いている Excel インスタンスを調べ、
>  それらを事前に閉じてから操作する。
> http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=10322
私もこのやり方しかないと思い、最終手段としてこれを使おうかと思っていました。
エクセルファイルを誰でも簡単に開けないようにPW等の処理をしておくことと、そのデータを使った作業を行いたいのです。エクセルを事前に閉じてしまうと、作業中のものを終了しなくてはならなくなり、少しアプリとしての扱いにくさが出てしまうのが課題です。

> (案2) C:\test.xls を直接開くのではなく、一時フォルダに別名でコピーし、
>  コピーしたファイルを New Excel.Application() + JET プロバイダで読み込む。
これも試してみたい方法ですね。別にコピーする際にPWをはずすということができるのでしょうか。また頻繁にやり取りをした場合に処理時間がかかってしまうのかが心配です。

> (案3) Microsoft.Jet.OLEDB.4.0 や Microsoft.ACE.OLEDB.12.0 での取り込みは諦めて、
>  Excel オートメーションで Range オブジェクト経由にてデータを取り出すようにする。
これは私には難しそうです。チャレンジしてみたいですが。

ありがとうございました。今後ともよろしくお願いします。



引用返信 編集キー/
■57445 / inTopicNo.4)  Re[3]: VB.NETでエクセルを使ったADOデータベース処理
□投稿者/ 魔界の仮面弁士 (2112回)-(2011/02/27(Sun) 18:17:45)
No57444 (ふく さん) に返信
問題はまだ解決していないようですが、本題とは関係ない所に反応しておきます。

No57443
>> (案2) C:\test.xls を直接開くのではなく、一時フォルダーに別名でコピーし、

No57444
>> (案2) C:\test.xls を直接開くのではなく、一時フォルタ゛に別名でコピーし、

私の発言を引用するに当たり、何故か、「半角カナへの改変」 & 「長音記号の除去」を
行われたようですが、ここでの半角カナの利用は禁じられています。次回利用時にはご注意ください。
http://bbs.wankuma.com/index.cgi?mode=man

また、folder の日本語表記は、「フォルダ」ではなく「フォルダー」が正しいとされています。
http://www.microsoft.com/Language/ja-jp/StyleGuides.aspx
http://www.microsoft.com/japan/presspass/detail.aspx?newsid=3491

とはいえ私も、昔の癖で、長音記号を抜いてしまう事がたびたびあるのですけれどね。
(今回も、Provider の末尾長音記号を忘れてしまいましたし)


> 私もこのやり方しかないと思い、最終手段としてこれを使おうかと思っていました。
であれば、質問時にその案を提示しておいてもらえるとありがたかったです。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -