使用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
)。
然后我使用表格上的DataGrid
和ItemsSource="{Binding Source={x:Static l:Handlers.DatabaseHandler}, Path=DBPartitionData}"
上的Binding="{Binding TABLE_NAME}"
将WPF DataGridTextColumn
绑定到该表的内容。
这适用于TABLE_NAME
和PARTITION_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()返回零长度值。
答案 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即可解决您的问题并导致检索并显示整个值。