绑定到 HIGH_VALUE
Bind to HIGH_VALUE
使用 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
绑定到 table 的内容,在 table 上使用 ItemsSource="{Binding Source={x:Static l:Handlers.DatabaseHandler}, Path=DBPartitionData}"
并在 DataGridTextColumn
.
这适用于 TABLE_NAME
和 PARTITION_NAME
,但 HIGH_VALUE
不显示。 SQL 查询在 Oracle SQL Developer 中运行良好。
环顾四周,似乎 HIGH_VALUE
以某种内部 oracle 格式存储 - 所以我的问题是:
如何绑定到该值?甚至使用它?我可以使用 Oracle.DataAccess.Types
中的哪一个(如果有的话),或者如果所有其他方法都失败了,我如何不解析它而直接显示该值?返回对象上的 ToString() 似乎只给出空字符串。
plenty of sites 解释了如何使用 pl/SQL 获取值,但没有说明如何在 .NET 中将其显示为(任何类型的)字符串。
感谢您的帮助。
--编辑--
我无法调试并查看 sql 查询返回的数据 table 中的内容,因为我的本地计算机上没有带分区的 Oracle 版本 - 只有测试机(没有 VS)。但是,放入一些日志记录,似乎:返回的 HIGH_VALUE 值是非空的,并且 ToString() returns 是一个零长度值。
USER_TAB_PARTITIONS.HIGH_VALUE
列是 LONG
,Oracle 很久以前就弃用了它,但仍在内部使用。使用它们有点麻烦,这就是为什么他们告诉其他人改用 LOB。
来自OracleDataReader documentation:
By default, InitialLONGFetchSize is set to 0. In this case, ODP.NET does not fetch any LONG or LONG RAW column data during the Read method invocations on the OracleDataReader object.
虽然它继续提到显式调用类型化访问器方法,但它还说:
To be able to fetch the entire LONG or LONG RAW data without having a primary key column, a ROWID, or unique columns in the select list, set the size of the InitialLONGFetchSize property on the OracleCommand object to equal or greater than the number of characters or bytes needed to be retrieved.
和
By setting InitialLONGFetchSize to -1, it is possible to fetch the entire LONG or LONG RAW data from the database for a select query, without requiring a primary key, ROWID, or unique column in the select list.
在您的情况下,似乎只需将 InitialLONGFetchSize
更改为 -1 即可解决您的问题并导致检索和显示整个值。
使用 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
绑定到 table 的内容,在 table 上使用 ItemsSource="{Binding Source={x:Static l:Handlers.DatabaseHandler}, Path=DBPartitionData}"
并在 DataGridTextColumn
.
这适用于 TABLE_NAME
和 PARTITION_NAME
,但 HIGH_VALUE
不显示。 SQL 查询在 Oracle SQL Developer 中运行良好。
环顾四周,似乎 HIGH_VALUE
以某种内部 oracle 格式存储 - 所以我的问题是:
如何绑定到该值?甚至使用它?我可以使用 Oracle.DataAccess.Types
中的哪一个(如果有的话),或者如果所有其他方法都失败了,我如何不解析它而直接显示该值?返回对象上的 ToString() 似乎只给出空字符串。
plenty of sites 解释了如何使用 pl/SQL 获取值,但没有说明如何在 .NET 中将其显示为(任何类型的)字符串。
感谢您的帮助。
--编辑--
我无法调试并查看 sql 查询返回的数据 table 中的内容,因为我的本地计算机上没有带分区的 Oracle 版本 - 只有测试机(没有 VS)。但是,放入一些日志记录,似乎:返回的 HIGH_VALUE 值是非空的,并且 ToString() returns 是一个零长度值。
USER_TAB_PARTITIONS.HIGH_VALUE
列是 LONG
,Oracle 很久以前就弃用了它,但仍在内部使用。使用它们有点麻烦,这就是为什么他们告诉其他人改用 LOB。
来自OracleDataReader documentation:
By default, InitialLONGFetchSize is set to 0. In this case, ODP.NET does not fetch any LONG or LONG RAW column data during the Read method invocations on the OracleDataReader object.
虽然它继续提到显式调用类型化访问器方法,但它还说:
To be able to fetch the entire LONG or LONG RAW data without having a primary key column, a ROWID, or unique columns in the select list, set the size of the InitialLONGFetchSize property on the OracleCommand object to equal or greater than the number of characters or bytes needed to be retrieved.
和
By setting InitialLONGFetchSize to -1, it is possible to fetch the entire LONG or LONG RAW data from the database for a select query, without requiring a primary key, ROWID, or unique column in the select list.
在您的情况下,似乎只需将 InitialLONGFetchSize
更改为 -1 即可解决您的问题并导致检索和显示整个值。