tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルGetChunkとAppendChunkを扱うデータ型について
記事No11246
投稿日: 2014/03/19(Wed) 08:49
投稿者カルス
いつもお世話になっております。
アクセスのOLEオブジェクト型フィールドに画像データを書き込んだり読み込んだりすることで悩んでおります。

Dim data() As Byte = File.ReadAllBytes(OpenFileDialog1.FileName) ' 読み込み

Dim cnn As ADODB.Connection
Dim rsSyashin As ADODB.Recordset
Dim strSQL As String

cnn = New ADODB.Connection
rsSyashin = New ADODB.Recordset
cnn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + "写真.mdb" + ";", "", "", 0)
cnn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
strSQL = "SELECT * FROM テーブル1"
rsSyashin.Open(strSQL, cnn, ADODB.CursorTypeEnum.adOpenUnspecified, ADODB.LockTypeEnum.adLockOptimistic, 1)

rsSyashin.AddNew()
rsSyashin.Fields("写真").AppendChunk(data)
rsSyashin.Update()

rsSyashin.Close()
cnn.Close()

これでどうやら画像ファイルがフィールドに書き込まれたようなのですが・・・

Dim cnn As ADODB.Connection
Dim rsSyashin As ADODB.Recordset
Dim strSQL As String

cnn = New ADODB.Connection
rsSyashin = New ADODB.Recordset
cnn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + "写真.mdb" + ";", "", "", 0)
cnn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
strSQL = "SELECT * FROM テーブル1"
rsSyashin.Open(strSQL, cnn, ADODB.CursorTypeEnum.adOpenUnspecified, ADODB.LockTypeEnum.adLockOptimistic, 1)

Dim lngLogoSize As Long         ' サイズ
lngLogoSize = rsSyashin.Fields("写真").ActualSize
Dim oObj As Object = rsSyashin.Fields("写真").GetChunk(CInt(lngLogoSize))

rsSyashin.Close()
cnn.Close()

これでOLEオブジェクト型からデータが取得できたようです。


悩んでいるのはObject型からどうやって画像ファイルに書き出そうかと。
AppendChunkはByte型を読み込んでいるので
GetChunkでできた型をなんとかByte型にできたらいいのですが
Object型だとどうにも変換できずに悩んでいます。

AppendChunkとGetChunkの使い方が悪いのかととも思いここに質問させていただきました。

よろしくおねがいいたします。

[ツリー表示へ]
タイトルRe: GetChunkとAppendChunkを扱うデータ型について
記事No11247
投稿日: 2014/03/19(Wed) 09:48
投稿者魔界の仮面弁士
> cnn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + "写真.mdb" + ";", "", "", 0)
 cnn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=写真.mdb;", "", "", 0)
で良いような。
連結するにしても、+ より & の方が VB 的かな。


> cnn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
> strSQL = "SELECT * FROM テーブル1"
> rsSyashin.Open(strSQL, cnn, ADODB.CursorTypeEnum.adOpenUnspecified, ADODB.LockTypeEnum.adLockOptimistic, 1)

なぜ、adOpenUnspecified を指定されているのでしょうか。
adUseClient カーソルなのですから、adOpenStatic 一択ですよね。

以下、Jet 4.0 におけるカーソルモードの組み合わせ表
http://www.gizcollabo.jp/vbtomo/log/archive/vbdatabase_1483_0.html


ついでに、このあたりも参考に。
http://support.microsoft.com/kb/321415/ja
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?no=7177&reno=7174&oya=7168&mode=msgview&page=0

[相互運用型の埋め込み]を True にしている場合は、As ADODB.Connection が使われますが、
[相互運用型の埋め込み]を False にしている場合は、As ADODB.ConnectionClass とするようです。
また、COM オブジェクトに関して Marshal.ReleaseComObject の呼び出しも必要となりますね。



> Dim lngLogoSize As Long         ' サイズ
> lngLogoSize = rsSyashin.Fields("写真").ActualSize
何故、Long 型の変数を利用しておられるのでしょうか?

> Dim oObj As Object = rsSyashin.Fields("写真").GetChunk(CInt(lngLogoSize))
その Object 型に、どのようなデータ型が格納されているか確認されましたか?
Nothing でしょうか、DBNull でしょうか、あるいは Byte() でしょうか、それとも…。


> 悩んでいるのはObject型からどうやって画像ファイルに書き出そうかと。
念のために確認。
Microsoft Access の UI から埋め込んだ場合は、OLE オブジェクトとして
格納されますので、生の画像バイナリとは異なりますが、
今回は画像データそのものを書き込んでいるのですね?


以下蛇足:バイナリデータを SQL 文で INSERT する手法
http://yaplog.jp/orator/archive/36


> AppendChunkはByte型を読み込んでいるので
Byte() 型ではなく?


> GetChunkでできた型をなんとかByte型にできたらいいのですが
> Object型だとどうにも変換できずに悩んでいます。
DirectCast なり CType なりで、「本来の型」にキャストしてみましょう。

[ツリー表示へ]
タイトルRe^2: GetChunkとAppendChunkを扱うデータ型について
記事No11248
投稿日: 2014/03/19(Wed) 17:50
投稿者カルス
いろいろなご指導ありがとうございます。
mdbのVBの扱いについて不慣れでして、動作さえすれば的な感じでコードを書いていました。
指摘の部分については早速に参考URL等をみて変更します。

> Microsoft Access の UI から埋め込んだ場合は、OLE オブジェクトとして
> 格納されますので、生の画像バイナリとは異なりますが、
> 今回は画像データそのものを書き込んでいるのですね?

そうです。ある程度の枚数の画像ファイルを縮小して保存をします。
ファイルを1つにする必要があった為mdbに格納するという手段にしました。

> > AppendChunkはByte型を読み込んでいるので
> Byte() 型ではなく?
ご指摘のとおりByte()型です。

>
> > GetChunkでできた型をなんとかByte型にできたらいいのですが
> > Object型だとどうにも変換できずに悩んでいます。
> DirectCast なり CType なりで、「本来の型」にキャストしてみましょう。
DirectCastで無事にByte()型に変換できました。
これをファイルに書き込むことで画像をファイルにすることができました。

本当にありがとうございました。

[ツリー表示へ]