Oracle DB から取得した XML に奇妙な問題があります。私は OraDB11g を使用していますが、私の問題は次のとおりです。
CHAR 型の列を持つテーブルを作成し、テーブルの行を含むカーソルを返すクエリから XML を取得すると、適切な OraDbType コード 104 が返されます。
テーブルの作成:
create table AA_Table1
(
ID number(2,0) not null,
**ColumnA char(1) null,
ColumnB char(1) default 'S' not null,**
constraint PK_AA_Table1
primary key ( ID )
)
tablespace "X"
storage
(
...
)
compress for all operations
;
および返された XML:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema id="o_ListaTable" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop">
<xs:element name="o_ListTable" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="o_List" msprop:REFCursorName="REFCursor">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" msprop:OraDbType="111" type="xs:short" minOccurs="0" />
**<xs:element name="COLUMNA" msprop:OraDbType="104" type="xs:string" minOccurs="0" />
<xs:element name="COLUMNB" msprop:OraDbType="104" type="xs:string" minOccurs="0" />**
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
しかし...テーブルに別の列を挿入して変更すると、その後、新しく追加された列に対して返されたXMLで間違ったOraDBTypeコードが取得されます...
新しい列が追加されました: alter table AA_Table1 add ColumnC char(1) default 'S' not null;
返される XML は次のとおりです。
<?xml version="1.0" encoding="utf-16"?>
<xs:schema id="o_ListaTable" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop">
<xs:element name="o_ListTable" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="o_List" msprop:REFCursorName="REFCursor">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" msprop:OraDbType="111" type="xs:short" minOccurs="0" />
<xs:element name="COLUMNA" msprop:OraDbType="104" type="xs:string" minOccurs="0" />
<xs:element name="COLUMNB" msprop:OraDbType="104" type="xs:string" minOccurs="0" />
**<xs:element name="COLUMNC" msprop:OraDbType="126" type="xs:string" minOccurs="0" />**
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
私の質問は、この OraDbType コードが異なるのはなぜですか? テーブルの作成時に同じ列タイプ CHAR(1) NOT NULL DEFAULT 'S' が作成され、OraDbType が正常であることを確認してください。これはバグである可能性があると思います...
このため、適切な XML パーサーを使用して CHAR(1) 列を他の型に変換することはできません。この場合は、.Net bool 型に変換します。私のパーサーは現在、OraDbType コード 126 を無視しています。これは、nvarchar2 にも使用されるコードであり、nvarchar2 を bool に変換しないためです。
どうすればこの問題を解決できますか?
私が行ったいくつかの追加のテスト: また、null 可能/null 不可の新しい列をデフォルト値で挿入しました:
**alter table AA_Table1 add ColumnD char(1);
alter table AA_Table1 add ColumnE char(1) not null;
alter table AA_Table1 add ColumnF char(1) default 'S';**
返された XML は次のとおりです。
<?xml version="1.0" encoding="utf-16"?>
<xs:schema id="o_ListTable" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop">
<xs:element name="o_ListTable" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="o_Lista" msprop:REFCursorName="REFCursor">
<xs:complexType>
<xs:sequence>
<xs:element name="COLUMNA" msprop:OraDbType="104" type="xs:string" minOccurs="0" />
<xs:element name="COLUMNB" msprop:OraDbType="104" type="xs:string" minOccurs="0" />
<xs:element name="COLUMNC" msprop:OraDbType="126" type="xs:string" minOccurs="0" />
**<xs:element name="COLUMND" msprop:OraDbType="104" type="xs:string" minOccurs="0" />
<xs:element name="COLUMNE" msprop:OraDbType="104" type="xs:string" minOccurs="0" />
<xs:element name="COLUMNF" msprop:OraDbType="104" type="xs:string" minOccurs="0" />**
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
すべての OraDbTypes は適切ですが、列の 1 つが null ではなく、デフォルト値が設定されていることを除きます。この問題の解決策はありますか?
間違ったコード (ColumnC) を返す列の型をCHAR(1) null デフォルト 'S'に変更してから、元の型CHAR(1) not null デフォルト 'S'に再度変更すると、正しい結果が得られます。 ORaDbType コード 104 は 126 ではなく、期待どおりです。この動作は奇妙です。これは Oracle のバグでしょうか?
次の Oracle DLL とそれぞれのバージョンを使用しています。
oci.dll (バージョン 11.2.0.1)
Oracle.DataAccess.dll (バージョン 4.112.3.0)
orannzsbb11.dll (バージョン 11.0.0.1)
oraocci11.dll (バージョン 11.2.0.3)
OraOps11w.dll (バージョン 2.112.3.0)