0

Asp.Net 4、C#、Oracle 11g

こんにちは。htmlファイルの内容をOracleCLOB列に保存しようとしています。htmlファイルはasp:Uploadボタンを介してサーバーにアップロードされます。ほとんどの場合正常に動作しています。問題は、ボタンのFileContentプロパティのストリームのバイト数が奇数であり、clob列のWriteメソッドが例外をスローして偶数が必要であることを示していることです。バイトの

どうすればこの問題を解決できますか?HTMLファイルのバイト数を偶数にするためにできることはありますか?HTMLファイルはUTF8としてエンコードされ、エンコードを変更するとバイト数が変更されますが、それでも偶数です。

前もって感謝します

編集:今のところ、ストリームの長さが奇数の場合はバッファのサイズを1増やしてから、ストリームをそれ自体の長さでバッファに書き込み、デフォルトで最後のバイトをバッファに書き込みます。バッファ。この方法で行う際の潜在的なエラーについてアドバイスしてください。

var buffer = new byte[(stream.Length % 2 > 0? stream.Length + 1: stream.Length)];
stream.Read(buffer, 0, (int)stream.Length);
clob.Write(buffer, 0, buffer.Length);

再度、感謝します

編集:以前の解決策は機能しませんでした。新しいアプローチは、ストリームを文字列に渡し、文字列の最後にスペースを追加してから、再度ストリームに変換することで構成されます。今までは問題なく動作しています。申し訳ありませんが、コードを投稿できません...StackOverflowのコードに4つのスペースがあるというこのポリシーを克服する方法がわからなかっただけです。

4

1 に答える 1

3

System.Data.OracleClient(Oracle の ODP.NET とは対照的に) クラスを使用していると仮定しています。

このOracleLobクラスには、CLOB の処理に期待される文字列を書き込むメソッドがありません。代わりに、ドキュメントには次のように記載されています。

.NET Framework Data Provider for Oracle は、すべての CLOB および NCLOB データを Unicode として処理します。したがって、CLOB および NCLOB データ型にアクセスするときは、常にバイト数を扱うことになります。ここで、各文字は 2 バイトです。たとえば、文字セットが 1 文字あたり 4 バイトの Oracle サーバーに 3 文字を含むテキストの文字列を NCLOB として保存し、書き込み操作を実行する場合、文字列の長さを 6 バイトと指定します。サーバーに 12 バイトとして格納されます。

このコンテキストでは、Unicodeは UTF-16 エンコーディングを意味し、ほとんどの文字に 2 バイト、補助プレーンの文字に 4 または 6 バイトを必要とします。

したがって、文字列がある場合は、最初にそれを UTF-16 に変換する必要があります。

byte[] utf16Bytes = Encoding.Unicode.GetBytes(str);
clob.Write(utf16Bytes, 0, utf16Bytes.Lenght);

または、 a を使用しStreamWriterて同じことを実現できます。

OracleLob clob = ...
using (StreamWriter writer = new StreamWriter(clob, Encoding.Unicode))
{
    writer.Write(str);
}

データが UTF-8 でエンコードされたバイト配列にある場合は、UTF-16 に変換する必要があります。

byte[] utf8Data = ...
byte[] utf16Data = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utf8Data);
clob.Write(utf16Data, 0, utf16Data.Length);
于 2013-01-08T19:02:52.943 に答える