【问题标题】:Execute 32bit C# console application which connects to Oracle 9.2 on Windows 2003 R2 Server在 Windows 2003 R2 Server 上执行连接到 Oracle 9.2 的 32 位 C# 控制台应用程序
【发布时间】:2014-09-29 01:18:05
【问题描述】:

我在启动要在 Windows 2003 R2 Server 上运行的小型 C# 控制台应用程序时遇到问题。 该演示用于检查为什么无法建立与位于 Windows 2003 R2 服务器上的 Oracle 9.2 的连接,运行来自 IIS 上托管的 WCF 的相同代码。

    static void Main(string[] args)
    {
        try
        {

            string CONNECTION_STRING =
                      "User Id=YYYY;Password=ZZZZ;Data Source=(DESCRIPTION=" +
                      "(ADDRESS=(PROTOCOL=TCP)(HOST=X.XXX.X.X)(PORT=1521))" +
                      "(CONNECT_DATA=(SID=ORCL)));";
            string oradb = CONNECTION_STRING;

            using (OracleConnection conn = new OracleConnection(oradb))
            {
                conn.Open();
                Console.WriteLine("Connected to Oracle Database {0}", conn.ServerVersion);
                Console.WriteLine();

                OracleCommand cmd = new OracleCommand();
                cmd.Connection = conn;
                cmd.CommandText = "select * from cur_clients";
                cmd.CommandType = CommandType.Text;

                OracleDataReader dr = cmd.ExecuteReader();
                dr.Read();

                //var Text = dr.GetString(0);
                object[] values = new object[dr.FieldCount];
                dr.GetValues(values);
                foreach (var value in values)
                {
                    Console.Write("{0},",value);
                }

                conn.Close();
                //conn.Dispose();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error : {0}", ex);
        }
        Console.WriteLine("Press ENTER to continue");
        Console.ReadLine();
    }

}

服务器已安装 Oracle 9.2 数据库。 从远程机器从外部运行相同的代码一切正常,但在本地系统中却不行。

返回错误

[2014.08.05 17:23:37.79808] OCIEnvNlsCreate failed with return code -1 but error message text was not available.
   at System.Data.OracleClient.OciHandle..ctor(OciHandle parentHandle, HTYPE handleType, MODE ocimode, HANDLEFLAG handleflags)
   at System.Data.OracleClient.OciNlsEnvironmentHandle..ctor(MODE environmentMode)
   at System.Data.OracleClient.OCI.DetermineClientVersion()
   at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
   at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
   at System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
   at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.OracleClient.OracleConnection.Open()

根据一些信息,这是对 Oracle 安装文件夹的权限问题。在完全控制 C:\Oracle\Ora92 后,第一个问题消失了,但下一个问题又出现了。

    Error : System.Data.OracleClient.OracleException (0x80131938): ORA-12705: invalid or unknown NLS parameter value specified

   at System.Data.OracleClient.OracleException.Check(OciErrorHandle errorHandle, Int32 rc)
   at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integ
   at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
   at System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPo
   at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptio
   at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.OracleClient.OracleConnection.Open()
   at OracleConsoleTest.Program.Main(String[] args)

在注册表中搜索 NLS 语言参数后,我在位置上找到了 HKLM\SOFTWARE\ORACLE\ 有一个参数 NLS_LANG 的值为“NA”

删除此我的应用程序已启动,但所有其他第 3 方 Oracle 应用程序停止工作。

我真的不知道如何连接到旧的 Oracle 9.2 版本的正确方法。

我尝试了 Oracle 最新的 .NET 驱动程序,但它们不支持 Oracle 9.2

更多信息:来自同一台服务器的 SQLPlus 可以完美运行。数据库可以正常访问。

感谢任何有关此问题的帮助。

【问题讨论】:

    标签: c# sql oracle wcf oracle11g


    【解决方案1】:

    我在

    使用 Oracle 的 Instant Client 解决了这些问题

    http://www.oracle.com/technetwork/topics/winsoft-085727.html.

    需要将 dll 复制到与可执行文件相同的文件夹中。

    这样我解决了 OCIEnvNlsCreate 异常。 我解决了从代码本身设置环境变量的 NLS_LANG 异常。 我不允许更改注册表设置,所以我必须从我的代码中设置变量并且它有效。这样,环境变量只为当前正在运行的进程设置。

    Environment.SetEnvironmentVariable("NLS_LANG", "American_America.UTF8");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      相关资源
      最近更新 更多