- - PR -
C#+ODP.NETでSystem.AccessViolationException
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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) よろしくお願いします。 | ||||
|
投稿日時: 2007-01-22 11:07
ODPのバージョンを最新(10.2.0.2.2)にして同様のエラーが発生するか試してみて下さい。
ODP10.1で同じようなエラー報告がいくつかありましたが、殆どがバージョンUPで解決しているようです。 | ||||
|
投稿日時: 2007-01-22 15:19
ありがとうございます。
ODPのバージョンをあげて試してみます。 | ||||
|
投稿日時: 2007-01-24 16:31
ODPのバージョンを最新(10.2.0.2.20)にして実行してみましたが今度は違うエラーが出てしまいました。
エラーの内容は以下のとおりです。 ORA-24817: 指定したチャンクを現行のLOB操作に割り当てることができません DBのほうの問題のようなメッセージなんですけど、DB設定で回避できるんでしょうか? どなたか同じ現象にあわれたかたいませんか? | ||||
|
投稿日時: 2007-01-24 17:24
原因: db char/ncharセットの幅が固定されていないため、指定されたサイズは、サーバーからのバイト数を反映するために増大しています。 処置: クライアント・サーバー間でキャラクタ・セットを変換する場合やピース単位で読取りまたは書込みを実行する場合は、より小さいチャンク・サイズを使用してください。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-01-24 17:54
ありがとうございます。
申し訳ありません。「処置」を読んでもいまいち理解できなかったので教えてください。 「より小さいチャンク・サイズを使用してください」とありますが、チャンク・サイズはどこで設定すればよいのでしょうか? | ||||
|
投稿日時: 2007-01-24 21:34
チャンク・サイズはCreate TableのオプションのCHUNKで指定できるんですね。
いままで使ったことがないオプションだったので「チャンク」と言われてもわかりませんでした。 チャンク・サイズはデータベースのブロックサイズ以下には出来ないようなので指定できる最小値で試してみたのですが、結果は同じでした。 | ||||
|
投稿日時: 2007-01-25 15:20
解決しました。というかとりあえずエラーがでなくなりました。
CLOB型をやめてNCLOB型かBLOB型にすればとりあえずエラーは出なくなりました。 |
1