问题标签 [odp.net-managed]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1075 浏览

vb.net - 在 ODP.NET/EF 连接上使用 ALTER SESSION 进行不区分大小写的搜索?

我有一些 EF/LINQ 语句需要不区分大小写的文本搜索,但我们的 oracle 数据库区分大小写。如何在连接/命令级别执行必要的 ALTER SESSION 语句,以便影响后续的相同上下文调用?

我认为我需要运行的命令(OTN 线程

我知道Database.ExecuteSqlCommandDatabase.Connection.CreateCommand作为方法,但我不知道“何时”。如果我在创建之后但在 LINQ 之前手动尝试对上下文执行此操作,我必须手动打开和关闭连接,然后它似乎是与 LINQ 不同的事务,并且似乎没有应用。

0 投票
1 回答
1310 浏览

oracle - 带有 oracle edmx StoreGeneratedPattern="Identity" 问题的 EF 5

我们将 EF5 与 Oracle [Oracle.manageddataaccess.client] 一起使用。每当我创建/刷新 edmx 时。我会丢失属性 StoreGeneratedPattern="Identity"。我必须为每个实体手动设置它。

有没有办法自动化它或任何其他解决方法?我在这里错过了什么吗?

我们使用VS2013,下面是创建后edmx中的示例实体。

0 投票
2 回答
1163 浏览

vb.net - OracleConnection.Open 首次与完全托管的 Oracle 数据提供程序一起使用时出现 SocketException

使用 Oracle.ManagedDataAccess.Client,以下 VB.NET 行会引发内部异常:

conn.Open 语句成功但抛出以下异常:

更重要的是,打开第一个连接需要 1.5 秒。

如果我关闭连接并打开一个新连接,则没有问题。

我对非托管 Oracle 数据提供者没有这样的问题,第一次连接将在几分之一秒内完成。如果我连接到 Oracle 11g 或 12c 数据库服务器,这没有什么区别,因此看起来数据提供者是罪魁祸首。

数据提供者是否尝试了一些失败的东西,之后它在会话的其余部分默认为其他东西,如果是这样,我能做些什么来强制它第一次走成功的路径?

第一次连接的漫长等待仅仅是因为初始化 Oracle 池管理器的成本吗?如果是这样,我想我无法修复它的那部分,但即使是这样,我仍然想知道是否有可能做任何事情来摆脱 SocketException。

当 SocketException 被命中时,.NET 端的堆栈跟踪如下所示:

查看 Oracle .trc 文件,似乎没有什么异常。

0 投票
2 回答
4442 浏览

c# - C# - Oracle 存储过程返回没有行的 RefCursor

我的存储过程调用确实返回 7 行,但不是当我通过 Oracle 托管数据访问调用它时。

代码 :

存储过程

执行时: 无警告,无错误(所有参数均有效)

我的问题: 返回任何行(而不是预期的 7 行),但我检索了架构(列名是正确的)。


环境 :

  • 视窗 x64
  • .NET 框架:4.0
  • 已安装 Oracle 客户端 (v11.2) 但不是必需的
  • Oracle 数据提供者 .NET:Oracle.ManagedDataAccess (v121.1.2)
0 投票
5 回答
14776 浏览

.net - 为 oracle 管理的数据访问设置 NLS_LANG

我有一个通过 oracle.manageddataaccess(通过 NHibernate 4.0)使用 Oracle 12c 的 winforms c# 应用程序,oracle 数据库位于客户站点的另一台计算机上,由于 oracle 数据库和客户端计算机之间的 NLS_LANG 差异,我们遇到了字符集转换问题. 客户端计算机上没有安装 Oracle 客户端(仅使用托管驱动程序)。

我们发现您可以使用环境变量指定客户端 NLS_LANG。

我的问题是:在 Oracle 中使用新的托管数据访问时,还有其他方法可以指定 NLS_LANG 设置吗?

0 投票
1 回答
8099 浏览

odp.net - Oracle.ManagedDataAccess 连接请求超时

我在使用 Oracle ManagedDataAccess.dll 的线程代码时遇到问题。为了模拟这个问题,我创建了一个小型测试应用程序,它打开连接、执行查询并关闭连接。

发生的事情是,当我运行此代码时,conn.open() 语句中随机出现“连接请求超时”(ODP-1000)。现在我在那里做了很多谷歌搜索,它告诉我池大小太小,但这里不是这种情况,因为那样我会得到一个“池连接超时”异常 (ODP-1012)。我也玩过连接字符串属性,在测试应用程序中,当我设置更大的“连接超时”属性时,我可以让它完美地进行战争,但关键是这对我的应用程序没有帮助正在努力。

任何帮助或见解将不胜感激!

0 投票
1 回答
340 浏览

plsql - 是否可以在 ODP.Managed net 12 c 中捕获 DBMS_OUTPUT.PUT_LINE

需要捕获在读取游标的循环中执行的过程的 DBMS_OUTPUT.PUT_LINE。这可能与新的 ODP.Net 托管程序集有关吗?

对不起,我之前没有提到,Net调用是同步调用。DBMS_OUTPUT 会被 OracleInfoMessageEventHandler 捕获吗?

0 投票
1 回答
1950 浏览

dapper - 如何使用 Dapper micro-ORM 和 Oracle 来映射 NUMBER (OracleDecimal)

如果列类型为 NUMBER(x,y),ODP.NET 提供程序会在 IDataReader.GetValue()/GetValues() 中引发异常,这样它将溢出所有 .NET 数字类型。所以 Dapper 无法将这样的列映射到 POCO 属性。

我有一个使用 REF CURSOR 输出参数返回 3 列记录的 Oracle 存储过程。基本上所有 3 都是 NUMBER(一些东西),但ODP.NET Oracle 托管提供程序似乎决定将它们变成什么 ODP.NET 或 .NET 类型。

我一直在使用 Dapper 的 Query() 将记录从这个 sproc 映射到 POCO 时遇到问题。也许这实际上不是我的错,这一次——似乎当一列作为 ODP.NET 类型而不是 .NET 类型出现时,Dapper 失败了。如果我从我的 POCO 中评论一个有问题的专栏,一切正常。

这里有一对行来说明:

第一列在 .NET 中被视为int,第二列为OracleDecimal类型,第三列为十进制。第二个是问题。

例如,暂时删除 Dapper 并使用 vanilla ODP.NET 访问这些记录就表明了问题:

我在 Dapper 的 SqlMapper.cs 文件中所做的少量浏览和断点显示它正在使用 GetValue()/GetValues() 从读取器中提取数据,如上所述,但失败了。

有什么建议可以修补 Dapper 吗?非常感谢。

更新:

经过反思,我在 RTFMed: Oracle Data Provider for .NET Developer's Guide 的第 3 节“从 OracleDataReader 对象中获取数据”进行了解释。对于 NUMBER 列,ODP.NET 的 OracleDataReader 将尝试从 Byte 到 Decimal 的一系列 .NET 类型以防止溢出。但是 NUMBER 仍可能会溢出 Decimal,如果您尝试任何阅读器的 .NET 类型访问器 (GetValue()/GetValues()),则会给出无效的强制转换异常,在这种情况下,您必须使用阅读器的 ODP.NET 类型访问器 GetProviderSpecificValue( ),它给你一个 OracleDecimal,如果它溢出一个 Decimal,它的 Value 属性会给你一个溢出异常,你唯一的办法是使用 OracleDecimal 的 ToXxx() 方法之一将它强制转换为较小的类型。

但是,ODP.NET 类型访问器当然不是 Dapper 用来保存读取器对象的 IDataReader 接口的一部分,因此当列类型溢出所有 .NET 类型时,Dapper 本身似乎与 Oracle 不兼容。

问题仍然存在 - 聪明人知道如何扩展 Dapper 来处理这个问题。在我看来,我需要一个扩展点,我可以提供有关如何使用阅读器的实现(强制它使用 GetDouble() 而不是 GetValue(),或强制转换为 OracleDataReader 并为某些 POCO 属性调用 GetProviderSpecificValue())或列类型。

0 投票
1 回答
10666 浏览

c# - 使用 OracleConnection.Open() 时出错 ORA-00303:网络库:名称-值语法错误 ODP.NET 托管 dll

当我点击 source.Open(); 时出现此错误 一行代码,我不知道为什么。我使用的是非托管 dll,我正在尝试升级到 Oracle.ManagedDataAccess.dll 64 位版本,我的项目正在使用 .NET 框架 4。TNS 字符串在生产 tnsnames.ora 文件中工作(我已经替换了各种元素名称和值)。从错误看来,显然应该是错误的,但我无法让它工作。

app.config 中的 TNS:

代码片段:

错误:ORA-00303:网络库:名称-值语法错误

0 投票
9 回答
31243 浏览

c# - Oracle.ManagedDataAccess 和 ORA-01017:用户名/密码无效;登录被拒绝

我在我们的一台服务器上遇到了具有挑战性的情况。我有一个需要连接到 Oracle 12c 数据库的 ASP.NET MVC 3 应用程序。它使用以下连接字符串执行此操作:

我也在使用 Oracle 的 Oracle.ManagedDataAccess,版本 4.121.1.0。每次尝试连接都会导致以下错误:

我可以使用上述凭据在我的桌面上成功连接。我在另一台服务器上有相同的代码,但使用的是旧的、非托管版本的库,它可以使用上述凭据成功连接。但是,我希望运行我的代码的服务器每次使用相同的凭据都会失败,这些凭据可以在不同的服务器上成功连接。

在失败的服务器上,我可以:

  • 通过 SQLPLUS 连接
  • 使用 TNSPING 访问数据库
  • 创建系统 DSN 以建立 ODBC 连接

我检查了所有位置的 TNSNAMES.ORA,它们似乎是正确的。

在多次访问数据库后,该帐户实际上被锁定,这表明我确实在访问数据库并且数据库不喜欢提供的凭据。我检查了以前成功连接的应用程序,它们也失败了,错误提示帐户已被锁定。解锁帐户会导致这些应用程序成功连接,但我遇到问题的服务器除外。

我已经黔驴技穷了。

是否有人对可能导致此问题的原因有任何其他建议?

编辑

我在本地计算机和有问题的服务器上安装了 WireShark。我捕获了我的桌面和数据库以及有问题的服务器和数据库之间的通信。我发现我的桌面传达了密码:

而我遇到问题的服务器没有(或者至少这是假设):

有谁知道即使密码存在于连接字符串中也会阻止密码传输的安全/配置设置?

编辑(20180713):

在我的特殊情况下,问题是 FIPS 设置。

对于那些做研究的人来说,有几种方法可以解决这个问题。

  1. 您可以更改位于 HKLM\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy\Enabled 的注册表设置。如果启用 FIPS,则值为 1。如果禁用,则值为 0。您无需重新启动。

  2. 您遇到此问题的原因很可能是启用了 FIPS 并且您正在使用 Oracle 托管数据访问库。一个可靠的解决方法是使用非托管库。但是,要使用这个库,您需要安装 Oracle Instant Client。该客户端可在Oracle 数据访问组件中下载。

  3. 将您的服务器升级到 Oracle 12.2c。12.2c之前的Oracle 12c版本还是有这个问题。

如果您没有启用 FIPS,您很可能需要调查您的数据库是否将 SEC_CASE_SENSITIVE_LOGON 设置设置为 true。您将需要执行 ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE; 然后重置所有密码。