绑定到HIGH_VALUE

时间:2016-05-10 10:35:35

标签: wpf oracle type-conversion database-partitioning

使用VB.NET我将SQL查询的结果:

select TABLE_NAME, PARTITION_NAME, HIGH_VALUE from user_tab_partitions WHERE TABLE_NAME LIKE 'LXA%' OR TABLE_NAME LIKE 'LNX%'

进入DataTable(通过Oracle.DataAccess.Client.OracleDataReader)。

然后我使用表格上的DataGridItemsSource="{Binding Source={x:Static l:Handlers.DatabaseHandler}, Path=DBPartitionData}"上的Binding="{Binding TABLE_NAME}"将WPF DataGridTextColumn绑定到该表的内容。

这适用于TABLE_NAMEPARTITION_NAME,但HIGH_VALUE不显示。 SQL查询在Oracle SQL Developer中运行良好。

环顾四周,似乎HIGH_VALUE以某种内部oracle格式存储 - 所以我的问题是:

如何绑定到该值?甚至用它?我可以使用哪个Oracle.DataAccess.Types(如果有的话),或者如果所有其他方法都失败了,如何在不解析它​​的情况下直接显示该值?返回对象上的ToString()似乎只提供空字符串。

plenty sites解释了如何使用pl / SQL获取值,但没有说明如何在.NET中将其显示为(任何类型)字符串。

感谢您的帮助。

- 编辑 -

我无法调试并查看sql查询返回的数据表中的内容,因为我没有在我的本地计算机上使用分区的Oracle版本 - 仅在测试计算机上(没有VS) 。但是,在进行一些日志记录时,似乎:返回的HIGH_VALUE值为非null,而它们上的ToString()返回零长度值。

1 个答案:

答案 0 :(得分:2)

USER_TAB_PARTITIONS.HIGH_VALUE列是LONG,Oracle很久以前就弃用了它,但仍在内部使用。使用它们有点痛苦,这就是为什么他们告诉其他人使用LOB而不是。

来自OracleDataReader documentation

  

默认情况下,InitialLONGFetchSize设置为0.在这种情况下,ODP.NET在OracleDataReader对象的Read方法调用期间不会获取任何LONG或LONG RAW列数据。

虽然它继续提到显式调用类型化的访问器方法,但它也会说:

  

为了能够在选择列表中没有主键列,ROWID或唯一列的情况下获取整个LONG或LONG RAW数据,请将OracleCommand对象上的InitialLONGFetchSize属性的大小设置为等于或大于需要检索的字符数或字节数。

  

通过将InitialLONGFetchSize设置为-1,可以从数据库中获取选择查询的整个LONG或LONG RAW数据,而无需选择列表中的主键,ROWID或唯一列。

在您的情况下,似乎只需将InitialLONGFetchSize更改为-1即可解决您的问题并导致检索并显示整个值。