【问题标题】:connect mono to oracle error libclntsh.so将单声道连接到 oracle 错误 libclntsh.so
【发布时间】:2014-09-04 07:47:42
【问题描述】:

我是 linux ubuntu 和单声道运行时的新手,我尝试像通常在 windows 中那样连接到 oracle 11G(我在 windows 中使用 System.Data.OracleClient 和 Oracle.OracleClient 进行了尝试,并且都运行良好) 但 我在ubuntu中遇到了这个问题: System.DllNotFoundException:libclntsh.so 这是堆栈跟踪:

    libclntsh.so

Description: HTTP 500. Error processing request.

Stack Trace:

System.DllNotFoundException: libclntsh.so
  at (wrapper managed-to-native) System.Data.OracleClient.Oci.OciCalls/OciNativeCalls:OCIEnvCreate (intptr&,System.Data.OracleClient.Oci.OciEnvironmentMode,intptr,intptr,intptr,intptr,int,intptr)
  at System.Data.OracleClient.Oci.OciCalls.OCIEnvCreate (System.IntPtr& envhpp, OciEnvironmentMode mode, IntPtr ctxp, IntPtr malocfp, IntPtr ralocfp, IntPtr mfreep, Int32 xtramem_sz, IntPtr usrmempp) [0x00000] in <filename unknown>:0 
  at System.Data.OracleClient.Oci.OciEnvironmentHandle..ctor (OciEnvironmentMode mode) [0x00000] in <filename unknown>:0 
  at System.Data.OracleClient.Oci.OciGlue.CreateConnection (OracleConnectionInfo conInfo) [0x00000] in <filename unknown>:0 
  at System.Data.OracleClient.OracleConnectionPoolManager.CreateConnection (OracleConnectionInfo info) [0x00000] in <filename unknown>:0 
  at System.Data.OracleClient.OracleConnectionPool.CreateConnection () [0x00000] in <filename unknown>:0 
  at System.Data.OracleClient.OracleConnectionPool.GetConnection () [0x00000] in <filename unknown>:0 
  at System.Data.OracleClient.OracleConnection.Open () [0x00000] in <filename unknown>:0 
  at example.Default.button1Clicked (System.Object sender, System.EventArgs args) [0x0000d] in /home/danar/Projects/example/example/Default.aspx.cs:18 
  at System.Web.UI.WebControls.Button.OnClick (System.EventArgs e) [0x00000] in <filename unknown>:0 
  at System.Web.UI.WebControls.Button.RaisePostBackEvent (System.String eventArgument) [0x00000] in <filename unknown>:0 
  at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent (System.String eventArgument) [0x00000] in <filename unknown>:0 
  at System.Web.UI.Page.RaisePostBackEvent (IPostBackEventHandler sourceControl, System.String eventArgument) [0x00000] in <filename unknown>:0 
  at System.Web.UI.Page.RaisePostBackEvents () [0x00000] in <filename unknown>:0 
  at System.Web.UI.Page.ProcessRaiseEvents () [0x00000] in <filename unknown>:0 
  at System.Web.UI.Page.InternalProcessRequest () [0x00000] in <filename unknown>:0 
  at System.Web.UI.Page.ProcessRequest (System.Web.HttpContext context) [0x00000] in <filename unknown>:0

这是我到 oracle 的连接字符串,我使用了 System.data.oracleclient

string oradb = "Data Source=(DESCRIPTION="
                        + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))"
                        + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));"
                        + "User Id=hr;Password=hr;";
            OracleConnection conn = new OracleConnection(oradb);
            conn.Open();
            OracleCommand command=new OracleCommand();
            command.Connection=conn;
            command.CommandText="select * from employee";
            OracleDataReader reader=command.ExecuteReader();
            while(reader.Read())
            {
                Response.Write(reader[0]+"<br>");
            }
            conn.Close();
            command=null;
            reader.Close();
            reader=null;

【问题讨论】:

    标签: c# asp.net mono oracle11g


    【解决方案1】:

    您需要安装OCI,如per the documentation。此外,请记住,Oracle 数据客户端不再受支持(在 Mono 和 Microsoft .NET 中),因此您最安全的选择是use a commercial provider。您已经为数据库支付了好几美元,几百美元有什么区别?

    【讨论】:

    • 我认为 Oracle 自己提供了 100% 托管的 ODP.NET 版本,理论上应该可以在 Mono 上运行。 oracle.com/technetwork/topics/dotnet/…
    • 上次我尝试使用它,它仍然依赖于OCI,并且在Windows OS之外无法工作。当然,那是在 2008 年,情况可能会有所改善。另一方面,我们正在谈论 Oracle...
    • 可能是这样,但对我来说现在它工作得非常顺利,我添加了一个答案,因为我在网上任何地方都找不到我写的信息
    【解决方案2】:

    更新,因为原始答案已有 2 年历史。

    只需使用 Oracle 的托管驱动程序。你只需要那个,没有别的。然后,您可以使用简单的连接字符串直接连接到数据库。

    <system.data>
      <DbProviderFactories>
        <remove invariant="Oracle.ManagedDataAccess.Client" />
        <!-- If any should be in the machine.config -->
        <add name="Oracle Data Provider for .NET" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral" />
      </DbProviderFactories>
    </system.data>
    <connectionStrings>
      <clear />
      <add name="OracleContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="DATA SOURCE=<IP_ADDRESS>:1521/XE;PASSWORD=<PASSWORD>;USER ID=<USER_ID>;Connection Timeout=600;Validate Connection=true" />
    </connectionStrings>
    

    我将 ServiceStack 的 OrmLite 用作 ORM,但如果您不想使用 ORM 或与任何其他 ORM 一起使用,它也可以直接正常工作。您只需要确保您的 ORM 库也在使用托管驱动程序,而不是旧驱动程序。我写了一篇关于 hack 的博客文章,我不得不更改 ServiceStack.OrmLite.Oracle 以使用新的托管驱动程序。这解决了我所有的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      相关资源
      最近更新 更多