从 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。
我怎么解决这个问题?
我已经完成了一些额外的测试:还插入了可以为空/不可为空且具有默认值的新列:
**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 都是正确的,除了一个不为空且具有默认值的列。这个问题有什么解决办法吗?
如果我将返回错误代码的列的类型 (ColumnC) 更改为CHAR(1) null default 'S'然后再次将其更改为原始类型CHAR(1) not null default '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)