使用 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
(。
然后,我将 WPF DataGrid
绑定到该表的内容,在表上使用ItemsSource="{Binding Source={x:Static l:Handlers.DatabaseHandler}, Path=DBPartitionData}"
,在DataGridTextColumn
上使用Binding="{Binding TABLE_NAME}"
。
这适用于TABLE_NAME
和PARTITION_NAME
,但HIGH_VALUE
不显示。SQL 查询在 Oracle SQL Developer 中运行良好。
环顾四周,似乎HIGH_VALUE
以某种内部预言机格式存储 - 所以我的问题是:
如何绑定到该值?甚至使用它?我可以使用哪个Oracle.DataAccess.Types
(如果有(,或者如果所有其他方法都失败了,我如何直接显示值而不解析它?返回对象上的 ToString(( 似乎只给出空字符串。
有很多网站解释了如何使用 pl/SQL 获取值,但没有关于如何在 .NET 中将其显示为(任何类型的(字符串。
感谢您的帮助。
--编辑--
我无法调试并查看从 sql 查询返回的数据表中的内容,因为我的本地机器上没有带有分区的 Oracle 版本 - 仅在测试机器上(没有 VS(。但是,放入一些日志记录,似乎:返回的HIGH_VALUE值是非空的,并且它们的 ToString(( 返回一个零长度值。
USER_TAB_PARTITIONS.HIGH_VALUE
列是一个LONG
,Oracle很久以前就弃用了它,但内部仍在使用。使用它们有点痛苦,这就是为什么他们告诉其他人改用 LOB 的原因。
来自 OracleDataReader 文档:
默认情况下,InitialLONGFetchSize 设置为 0。在这种情况下,ODP.NET 不会在 OracleDataReader 对象上的读取方法调用期间提取任何 LONG 或 LONG RAW 列数据。
虽然它继续提到显式调用类型化访问器方法,但它随后也说:
为了能够在选择列表中没有主键列、ROWID 或唯一列的情况下获取整个 LONG 或 LONG RAW 数据,请将 OracleCommand 对象上的 InitialLONGFetchSize 属性的大小设置为等于或大于需要检索的字符数或字节数。
和
通过将 InitialLONGFetchSize 设置为 -1,可以从数据库中获取整个 LONG 或 LONG RAW 数据以进行选择查询,而无需选择列表中的主键、ROWID 或唯一列。
在您的情况下,似乎只需将InitialLONGFetchSize
更改为 -1 即可解决您的问题并导致检索和显示整个值。