【问题标题】:Oracle access from C# program从 C# 程序访问 Oracle
【发布时间】:2011-11-16 14:29:55
【问题描述】:

如果有任何解决此问题的建议,我将不胜感激。
我不是专业开发人员,而是“继承”了一份报告工作的“业余爱好者”(感谢我对编程的兴趣——“从不做志愿者”的经典例子!)。

我正在尝试从 C# 访问 Oracle 10g 数据库。
为了让事情尽可能简单,我有一个带有单个按钮的裸 WPF 表单。 在按钮的单击事件中,我有以下代码(顺便说一句,在另一台 PC 上设置的早期程序中运行良好)-

using System.Data;
using System.Data.OracleClient;

...

string oraStr1 = "Data Source=(DESCRIPTION=(ADDRESS_LIST =(ADDRESS=(PROTOCOL=TCP)(HOST=myHost)(PORT=myPort)))(CONNECT_DATA=(SERVICE_NAME=myDB)));Password=myPassword;User ID=myUser;";

DataTable oraTable = new DataTable();
string queryString = "Select surname,forenames from person table where surname = 'Smith'";

using ( OracleConnection oraConnect = new OracleConnection( oraStr1 ) )
{
    try
    {
        OracleCommand OraCmd = new OracleCommand( queryString, oraConnect );  
        oraConnect.Open();

        OracleDataAdapter OraAdapter = new OracleDataAdapter();
        OraAdapter.SelectCommand = OraCmd;

        OraAdapter.Fill( oraTable );
    }
    finally
    {
        oraConnect.Close();
    }

现在...(C# Express Edition)应用程序正在远程服务器上的 VM 中运行。 我在此 VM 上的 share 还安装了 Oracle Database 10g Client Release 2 (10.2.0.1.0)。

此外,我还安装了 IT 部门的 Oracle 数据访问组件。

在 VM 中运行 ODBCAD32 时,驱动程序选项卡中不会列出任何 Oracle 驱动程序。

我相信安装的驱动程序失败了,这导致我的程序无法启动任何连接。但是,我没有证据,想知道这里有学问的人是否可以建议获得任何……?

读取IDE错误信息的前几行 -

System.Exception was unhandled
Message="OCIEnvCreate failed with return code -1 but error message text was not available."
Source="System.Data.OracleClient"
StackTrace:
     at System.Data.OracleClient.OciHandle..ctor(OciHandle parentHandle, HTYPE handleType, MODE ocimode, HANDLEFLAG handleflags)
     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()    

很抱歉这么啰嗦,但正如您所见,这个设置相当复杂...... :)

我没有资格告诉 IT 部门他们的工作,但如果我能提供任何建议,我将不胜感激?

【问题讨论】:

    标签: c# oracle odbc drivers


    【解决方案1】:

    我建议不要对数据提供者和自定义 sql 发疯。

    获取支持 Oracle(如 NHibernate)的 ORM 并让它完成工作。您唯一关心的是将表映射到您的对象,然后使用中性语言编写查询(现在 nhibernate 支持 linq 和 lambda 表达式,因此再简单不过了)。

    编码愉快:)

    【讨论】:

      【解决方案2】:

      对于 ADO.Net,我不会对 Oracle 驱动程序没有出现在 ODBC 小程序中感到惊讶 - 您使用的是 OLEDB 连接,它与 ODBC 不同。

      看起来您正在使用 System.Data.OracleClient,它是 Microsoft 的 Oracle 客户端,而不是 Oracle 公司的客户端——该客户端已被弃用(Microsoft 将来会停止支持它),我不会建议您使用它。

      在此处查看示例代码:http://www.carlprothman.net/Default.aspx?tabid=86#OracleNETDataProviderFromOracle

      或这里:

      http://www.connectionstrings.com/Providers/oracle-provider-for-ole-db-oraoledb

      以下是一些示例连接字符串: http://www.connectionstrings.com/oracle

      【讨论】:

        【解决方案3】:

        这是我的做法,但需要寻找新的方法,因为 OracleClient 的一部分在 4.0 和 4.5 中已过时

        string sqlquery = "select * from person"; 
        DataGridView1.DataSource = PullTableResults(sqlquery);
        
        private static DataTable PullTableResults(string sqlquery)
        {
           try
           {
               if (showMessages)
               {
                   MessageBox.Show(sqlquery);
               }
        
               var conn = new OracleConnection(Oradb);
               conn.Open();
               var cmd = new OracleCommand(sqlquery, conn);
               cmd.CommandType = CommandType.Text;
               var dr = cmd.ExecuteReader();
               var read = dr.Read();
               var table = new DataTable();
               var oda = new OracleDataAdapter(cmd);
               int fill = oda.Fill(table);
               conn.Close();
               conn.Dispose();
               return table;
           }
           catch (Exception ex)
           {
               const string Message = "Database Exception";
        
               if (showMessages)
               {
                   MessageBox.Show(Message + ex);
               }
        
               var table = new DataTable();
               return table; // return empty table cause there was error
           }
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-06
          • 1970-01-01
          • 2020-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-19
          相关资源
          最近更新 更多