- PR -

OCLOBでのDB内XMLデータ(特殊文字有)の取得

1
投稿者投稿内容
お椀
会議室デビュー日: 2009/04/02
投稿数: 1
投稿日時: 2009-04-02 16:16
質問です。よろしくお願いします。

環境:WindowsServer2003,WindowsXP SP
.NET 2003 MFC
oracle10g

DB内のXMLデータをOCLOBを使って取得しようとしたのですが
XMLタグ内にエンティティ参照文字("&"や"""など)がある場合、
同じXMLデータでも、PCによってREADメソッドの戻り値(読込データ長の合計バイト数)が異なる値が返りました。
一方は特殊文字を"&"と数えたバイト数、もう一方は"&"と数えたバイト数になっているようです。
「"&"と数えたバイト数」を返したのをWindowsServer2003で確認しました。
「"&"と数えたバイト数」をWindowsXP及びWindowsServer2003で確認しました。

これらは何に依存して決められるのか、ご存知の方いましたらご教授お願いします。

※文中のエンティティ参照文字、表示しないので全角で書きました。本当は半角です。)
-------------------------------------
以下、コードです。

// Clob型の取得
// 引数 rClob XMLデータ rBuff 格納用バッファ
// 戻り値 合計サイズ

int C***::GetClobData( OClob* rClob, char* rBuff )
{
unsigned char tWkBuff[DEF_EPG_APP_PNG_MAXSIZE];
unsigned char tSetBuff[DEF_EPG_APP_PNG_MAXSIZE*2];
unsigned long tbufsize;
short tstatus;
unsigned long tamtread;
unsigned long tpoint = 0;

memset( rBuff, 0, DEF_EPG_APP_PNG_MAXSIZE );
memset( tWkBuff, 0 , DEF_EPG_APP_PNG_MAXSIZE );
memset( tSetBuff, 0 , DEF_EPG_APP_PNG_MAXSIZE*2 );

try {
unsigned int tsize = rClob->GetSize();
unsigned long toptchunk = rClob->GetOptimumChunkSize();
tbufsize = ( ( int )( 32768 / toptchunk ) ) * toptchunk;
if (tbufsize > tsize)
{
tbufsize = tsize;
}
rClob->EnableStreaming( tbufsize );
tstatus = OLOB_NEED_DATA;
tamtread = 0;
tpoint = tamtread;
while( tstatus == OLOB_NEED_DATA )
{
tamtread = rClob->Read( &tstatus, tWkBuff, tbufsize ); // ←tamtreadの値がPCによって異なる
if( tpoint + tamtread >= DEF_EPG_APP_PNG_MAXSIZE )
{
return FALSE;
}
memcpy( &tSetBuff[tpoint], tWkBuff, tamtread );
tpoint += tamtread;
}
rClob->DisableStreaming();
memcpy( rBuff, tSetBuff, tpoint );
}
catch( OException e )
{
PutLog( loglvl_warning, "Clob エラー:[%s]:%s", e.GetFailedMethodName(), e.GetErrorText() ); // === LOG
}

return tpoint;
-----------------------------------------
よろしくお願いします。

[ メッセージ編集済み 編集者: お椀 編集日時 2009-04-02 16:22 ]

[ メッセージ編集済み 編集者: お椀 編集日時 2009-04-02 16:27 ]
1

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