- PR -

C#+ODP.NETでSystem.AccessViolationException

1
投稿者投稿内容
osaru
会議室デビュー日: 2004/06/18
投稿数: 14
投稿日時: 2007-01-20 21:14
C#でODP.NET経由でCLOB型の項目を持つテーブルにINSERTを行ったときにエラーが出て困っています。
処理はファイルの内容をそのままCLOB型に入れたいのですが、10Mのファイルは成功したんですけど、50Mのファイルをテストしようとしたらエラーになってしまいました。
すいませんがお知恵をお貸し下さい。

エラーの内容は以下のとおりです。
'System.AccessViolationException' の初回例外が Oracle.DataAccess.dll で発生しました。
保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。

ソースは以下のとおりで command.ExecuteNonQuery() を実行後にエラーになります。
private void insertCLOB(string filepath)
{
OracleConnection oraConn = null;
OracleCommand command = null;
OracleParameter oraPara= null;
try
{
string data;
using (StreamReader sr = new StreamReader(filepath))
{
data = sr.ReadToEnd();
sr.Close();
}

string connectString = String.Format("Data Source={0};User ID={1};Password={2}", "testdb", "testuser", "testpass");
oraConn = new OracleConnection(connectString);
oraConn.Open();

string query = "insert into ftpexchangedata" +
" (visitorcd, datakind, exchangekind, entrydate, datastat, ftpstat, exchangedata)" +
" values " +
" ('1', '1', '1', systimestamp, 0, 0, :exchangedata)";

oraPara = new OracleParameter(":exchangedata", OracleDbType.Clob, data.Length);
oraPara.Value = data;

command = new OracleCommand(query, oraConn);
command.BindByName = true;
command.Parameters.Add(oraPara);
command.ExecuteNonQuery();
}
catch (Exception ex)
{
System.Diagnostics.Debug.Print(ex.Message);
if (ex.InnerException != null)
{
System.Diagnostics.Debug.Print(ex.InnerException.Message);
}
}
finally
{
if (oraPara != null)
{
oraPara.Dispose();
oraPara = null;
}
if (command != null)
{
command.Dispose();
command = null;
}
if (oraConn != null)
{
oraConn.Dispose();
oraConn = null;
}
}
}

こちらの環境は
C#2005
ODP.NET 10.1.0.4.0
Oracle 10g(10.1.0.2.0)

よろしくお願いします。
未記入
大ベテラン
会議室デビュー日: 2006/12/15
投稿数: 157
投稿日時: 2007-01-22 11:07
ODPのバージョンを最新(10.2.0.2.2)にして同様のエラーが発生するか試してみて下さい。
ODP10.1で同じようなエラー報告がいくつかありましたが、殆どがバージョンUPで解決しているようです。
osaru
会議室デビュー日: 2004/06/18
投稿数: 14
投稿日時: 2007-01-22 15:19
ありがとうございます。
ODPのバージョンをあげて試してみます。
osaru
会議室デビュー日: 2004/06/18
投稿数: 14
投稿日時: 2007-01-24 16:31
ODPのバージョンを最新(10.2.0.2.20)にして実行してみましたが今度は違うエラーが出てしまいました。

エラーの内容は以下のとおりです。
ORA-24817: 指定したチャンクを現行のLOB操作に割り当てることができません

DBのほうの問題のようなメッセージなんですけど、DB設定で回避できるんでしょうか?
どなたか同じ現象にあわれたかたいませんか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-24 17:24
引用:

osaruさんの書き込み (2007-01-24 16:31) より:

エラーの内容は以下のとおりです。
ORA-24817: 指定したチャンクを現行のLOB操作に割り当てることができません
DBのほうの問題のようなメッセージなんですけど、DB設定で回避できるんでしょうか?


原因: db char/ncharセットの幅が固定されていないため、指定されたサイズは、サーバーからのバイト数を反映するために増大しています。
処置: クライアント・サーバー間でキャラクタ・セットを変換する場合やピース単位で読取りまたは書込みを実行する場合は、より小さいチャンク・サイズを使用してください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
osaru
会議室デビュー日: 2004/06/18
投稿数: 14
投稿日時: 2007-01-24 17:54
ありがとうございます。

申し訳ありません。「処置」を読んでもいまいち理解できなかったので教えてください。
「より小さいチャンク・サイズを使用してください」とありますが、チャンク・サイズはどこで設定すればよいのでしょうか?
osaru
会議室デビュー日: 2004/06/18
投稿数: 14
投稿日時: 2007-01-24 21:34
チャンク・サイズはCreate TableのオプションのCHUNKで指定できるんですね。
いままで使ったことがないオプションだったので「チャンク」と言われてもわかりませんでした。
チャンク・サイズはデータベースのブロックサイズ以下には出来ないようなので指定できる最小値で試してみたのですが、結果は同じでした。
osaru
会議室デビュー日: 2004/06/18
投稿数: 14
投稿日時: 2007-01-25 15:20
解決しました。というかとりあえずエラーがでなくなりました。

CLOB型をやめてNCLOB型かBLOB型にすればとりあえずエラーは出なくなりました。
1

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