- PR -

OracleのLONG RAWタイプカラムにバイナリデータを保存したい

1
投稿者投稿内容
ももだい
会議室デビュー日: 2003/10/27
投稿数: 10
投稿日時: 2004-03-10 17:56
お世話になります。ももだいと申します。

今回、社内のサーバーにExcelファイルなどを保存し
複数人でファイルを共有するシステムを構築することになりました。

仕様の問題から、OracleのLONG RAWタイプのカラムに
データを保存しようという話になったのですが、
OracleClientを使えば出来そう・・・までで、実際のデータの
insertの方法が全くわかりません。

Webを探し回ったのですが、OracleClientを使った方法が
見つかりませんでした。

ご存知の方、いらっしゃいませんでしょうか?
何卒よろしくお願い致します。

・開発環境
言語: VisualStudio.NET 2003 Enterprise Architect
C# + ASP.NET
OS: WindowsXP Professional(SP1)

・サーバー環境
OS: Windows Server 2003 Enterprise
DB: Oracle 8.00.05
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-03-10 18:47
「Oracle Data Provider for .NET 」
を使えばいいんじゃないですか?
使ったこと無いんで詳しくは知りませんが。

ただし、Oracleクライアントは9.2以上が必要ですが。
(サーバは8.0以上でいいらしい・・・)

詳しくは http://otn.oracle.co.jp あたりで調べてください。

[ メッセージ編集済み 編集者: Cluster 編集日時 2004-03-10 18:48 ]
ももだい
会議室デビュー日: 2003/10/27
投稿数: 10
投稿日時: 2004-03-10 19:01
Clusterさん
御返事ありがとうございました。

「Oracle Data Provider for .NET 」 ですが
開発環境のOracleクライアントは8.0.5ですので
対象外ということですね・・・
残念です。

従来のOLE DB ProviderではBLOB型は扱うことが
出来ないのでしょうか?

よろしくお願い致します。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-03-10 20:01
ももだいさん、こんばんは。

引用:

従来のOLE DB ProviderではBLOB型は扱うことが
出来ないのでしょうか?


出来ます。

以下のサンプルで動作確認できました。
# VB.NET です。申し訳ない。

コード:

Dim Comm As OleDbCommand = New OleDbCommand
Dim Buff As Byte()

-- 省略 --

Comm.CommandText = "insert into TESTTABLE(F1, F2) values(?,?)" 'F2 がLONG RAW 列
Comm.Parameters.Add("F1", OleDbType.Numeric, 10).Value = 1
Comm.Parameters.Add("F2", OleDbType.LongVarBinary).Value = Buff
Comm.ExecuteNonQuery()

Buff = Nothing

Comm.Parameters.Clear()
Comm.CommandText = "select F2 from TESTTABLE where F1=?"
Comm.Parameters.Add("F1", OleDbType.Numeric, 10).Value = 1
Buff = Comm.ExecuteScalar()



【追記】
ちなみに、Parameters.Add で "F1" とか "F2" とかパラメータ名を指定してますが、「.NET Framework Data Provider for OLE DB」では名前付きのパラメータは使用出来ないので、便宜上、こうしているだけです。


[ メッセージ編集済み 編集者: きくちゃん 編集日時 2004-03-10 20:08 ]
ももだい
会議室デビュー日: 2003/10/27
投稿数: 10
投稿日時: 2004-03-11 16:47
きくちゃんさん
お返事ありがとうございました。

教えて頂いたコードで希望通りの動作を実現することが出来ました!!
ありがとうございました!!

以下が検証に使ったコードです。
超大急ぎで作ったのでとても汚くて見難いですがご勘弁ください。

// BLOB型データインサートテスト

OleDbTransaction trnFs01;
OleDbConnection conFs01;
OleDbCommand cmdFs01;

// バイト配列準備
byte [] buff = new byte[3];

// とりあえず3byteのダミーデータを準備する
buff[0] = 0x30;
buff[1] = 0x33;
buff[2] = 0x35;

conFs01 = new OleDbConnection();
cmdFs01 = new OleDbCommand();

conFs01.ConnectionString = "Provider=MSDAORA.1;User ID=test;Data Source=test;Password=test";

// DB接続開始
conFs01.Open();

// トランザクション制御開始
trnFs01 = conFs01.BeginTransaction();
cmdFs01.Transaction = trnFs01;
cmdFs01.Connection = conFs01;

// insert文生成
cmdFs01.CommandText = "insert into p_momodai_blobtest(item_name, file_name, file_data) values(?,?,?)";

// パラメータマーカーにデータをセット
cmdFs01.Parameters.Add("item_name", OleDbType.VarChar, 20, "item_name").Value = "aaa";
cmdFs01.Parameters.Add("file_name", OleDbType.VarChar, 30, "file_name").Value = "bbb";
cmdFs01.Parameters.Add("file_data", OleDbType.LongVarBinary).Value = buff;

// クエリ実行
cmdFs01.ExecuteNonQuery();

// コミット!
trnFs01.Commit();

// DB接続終了
conFs01.Close();

他の助言をいただいた皆様にも感謝いたします。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)