获取Oracle表结构时,两种OleDb驱动得到的列数据类型“DATA_TYPE”值的类型不同
用OleDbConnection.GetOleDbSchemaTable( OleDbSchemaGuid.Columns,new object[] {null, schemaName, tableName, null} )方法获取列的架构信息时,返回的DataTable中有一列为"DATA_TYPE",是用一个数字来标识列的数据类型。此数字可能是Decimal类型或Int32型:
若"provider=MSDAORA.1;",则列"DATA_TYPE"的类型为Int32;
若"provider=OraOleDb.Oracle;",则列"DATA_TYPE"的类型为Decimal。
明白了这个区别,在把列的数据类型转换为OleDbType枚举中对应类型的字符串时,就不会发生转换错误了,因为
Enum.GetName( typeof( OleDbType ), intValue )
方法的第二个参数要求是Int32。当然,用微软的驱动没这个问题,若用Oracle的驱动,则必须先把Decimal转成Int32。
另外我还发现一个问题,就是传给GetOleDbSchemaTable()方法的参数中,微软的驱动是不区分大小写的,但Oracle的驱动必须要求大写。其实在一般的sql语句中Oracle也不区分大小写,只有当涉及到Oracle字典表时,Oracle才要求对象名称全部大写。由此我猜Oracle公司实现的OleDb驱动实际上是读取了后台的USER_TAB_COLUMNS等字典表。作为经验,传参数时都应该把字符串ToUpper()一下。
求教:我在项目中访问Oracle数据库基本上都是用OracleClient命名空间。但在必须用OleDb方式的地方,使用哪种驱动我一直没个准主意,不知各位有何高见。