(.net) OracleDataReader 错误地从 json_array() 返回空数组(适用于 sql Developer)

问题描述 投票:0回答:2

我正在尝试从 .net 客户端的 oracle db (v21) 获取自定义对象的集合。因为我无法进行任何类型映射,所以我想将其作为 json 获取。

这是查询:

select json_array("UDTARR") from sys.typetest

这是我在 sql Developer 中看到的结果(预期输出): 这是我通过 .net 执行相同查询时得到的结果:

"[]"

相同的策略(json_array())似乎在 .net 中对于原始类型的集合以及同一自定义对象的非集合类型字段工作得很好。

请有人告诉我我遗漏了一些明显的东西?

以下是类型定义,以防有人想尝试复制该问题:

“UDTARR”字段中使用的类型:

create type udtarray AS VARRAY(5) OF TEST_DATATYPEEX;

输入“TEST_DATATYPEEX”:

create type TEST_DATATYPEEX AS OBJECT
(test_id NUMBER,
vc VARCHAR2(20),
vcarray stringarray)

输入“STRINGARRAY”:

create type stringarray AS VARRAY(5) OF VARCHAR2(50);

执行查询并读取值的代码:

string query = "select json_array(\"UDTARR\") from sys.typetest"
using (var command = new OracleCommand(query, con))
using (var reader = command.ExecuteReader()){
    while (reader.Read()){
        Console.WriteLine(reader.GetString(0))
    }
}

在事件日志中,两个查询都会被记录,在这两种情况下,用户都以 dba 权限连接:

(来自 SQL Developer)

审计跟踪:LENGTH:'362'ACTION:[45]'select json_array(“UDTARR”) 来自 sys.typetest' 数据库用户:[3] 'SYS' 特权:[6] 'SYSDBA'

(来自.net)

审计跟踪:LENGTH:'361'ACTION:[45]'select json_array(“UDTARR”) 来自 sys.typetest' 数据库用户:[3] 'SYS' 特权:[6] 'SYSDBA'

c# .net oracle oracle-sqldeveloper oracle.manageddataaccess
2个回答
1
投票

COMMIT
ted 的数据仅在创建它的会话中可见(如果尚未
ROLLBACK
ted,则在会话结束时将
COMMIT
)。如果您看不到另一个会话中的数据(即在 C# 中),请确保您已在您
COMMIT
编辑数据的 SQL 客户端(即 SQL Developer)中发出
INSERT
命令。

注意:即使您以同一用户身份连接,这也会创建一个单独的会话,您将无法看到另一个会话中未提交的数据。

来自

COMMIT
文档

直到您提交交易:

  • 通过查询修改的表,您可以看到您在事务过程中所做的任何更改,但其他用户无法看到这些更改。提交事务后,更改对于提交后执行的其他用户的语句是可见的。
  • 您可以使用
    ROLLBACK
    语句回滚(撤消)事务期间所做的任何更改(请参阅
    ROLLBACK
    )。

1
投票

关闭SQL Developer提示我有未提交的更改;提交并关闭 SQL Developer 后,我现在也在 .NET 中收到了预期的数据。

我从未在任何其他 SQL 管理工具中看到过这样的行为,但是嘿,你生活并学习:)

© www.soinside.com 2019 - 2024. All rights reserved.