C#ORA-01012:未登录

时间:2018-12-25 05:48:42

标签: c# oracle .net-core oracle12c

我已经在.net Core API项目中建立了与Oracle数据库的连接

我使用this driver连接到Oracle

我的代码:

connection.Open();

using (OracleCommand cmd = connection.CreateCommand()) {
  cmd.CommandType = CommandType.StoredProcedure;

  cmd.CommandText = "MyPackage.SP";
  cmd.Parameters.Add(DbParam(cmd, "id", OracleType.Number, 1));
  cmd.Parameters.Add(DbOutParam(cmd, "out_key", OracleType.VarChar, 1024));

  try {
    cmd.ExecuteNonQuery();
    result = cmd.Parameters["out_key"].Value.ToString();
  } catch (OracleException oe) {
    Console.Out.WriteLine("OracleException: {0}: {1}", Tool.GetCurrentMethod(), oe.Message);
  }

  connection.Close();
}

我的连接字符串:

Data Source = ORACLE-DEV:1521/pdb;PERSIST SECURITY INFO=True;USER ID=user; Password=password;

有时候,连接消失了,当我获得所有连接后,一个例外:

ORA-01012: not logged on
Process ID: x
Session ID: y Serial number: z

我已经读过question,但是有一个用户通过将“验证连接”设置为true来解决该问题并保持警告状态

  

作为警告,我引用了Oracle文档。

     

“验证连接”属性可验证从中发出的连接   游泳池。仅在绝对必要时才应使用此属性   因为它导致服务器往返数据库以验证每个   连接提供给应用程序之前。如果无效   连接不常见,开发人员可以创建自己的事件   处理程序以检索新的连接,而不是使用Validate   连接。通常可以提供更好的性能。

我想知道捕获此类异常后该怎么办以及如何自动重新连接

try {
  cmd.ExecuteNonQuery();
} catch (OracleException oe) {
  Console.Out.WriteLine("OracleException: {0}", oe.Message);
  if (oe.Code == -1012) {
    // put your code here
  }
}

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在捕获到异常之后,我不会重试执行该查询,该解决方案可能会使您的应用程序运行缓慢且不稳定。

您的代码似乎很简单,可以使用官方驱动程序工作,那么为什么要使用您正在使用的非官方驱动程序?

尝试使用适用于.NET Core的最新Oracle驱动程序:

首先,删除当前的驱动程序,然后使用NuGet或NuGet控制台安装它:

Install-Package Oracle.ManagedDataAccess.Core -Version 2.18.3 

答案 1 :(得分:-1)

要回答您的问题,您可以尝试以下操作(简单的示例):

var attempt = 0;
while (attempt < 2) 
{
   try {
      cmd.ExecuteNonQuery();
      break;
   } catch (OracleException oe) {
      Console.Out.WriteLine("OracleException: {0}", oe.Message);
      if (oe.Code == -1012) {
         connection.Open();
         attempt++;
      }
   }
}
if (attempt == 2) {
  // you have a problem!
}

这将尝试,如果已关闭,请打开连接,然后重试。不确定会发生什么,但如果别的东西关闭此连接 - 你需要处理的是适当的外循环

但是,这仅仅是隐藏潜在的问题。