从c#程序访问Oracle

本文关键字:Oracle 访问 程序 | 更新日期: 2023-09-27 18:14:44

对于解决这个问题我将非常感谢。
我不是专业开发人员,而是一个"业余爱好者","继承"了一份报道工作(多亏了我对编程的兴趣——"从不自愿"的经典例子!)。

我试图从c#访问Oracle 10g数据库。
为了使事情尽可能简单,我有一个带有单个按钮的裸WPF表单。在按钮的click事件中,我得到了以下代码(顺便说一下,它在不同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上的共享也安装了Oracle Database 10g Client Release 2(10.2.0.1.0)。

另外,我已经让IT安装了Oracle数据访问组件。

在虚拟机中运行ODBCAD32时,drivers选项卡中没有列出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

我建议不要在数据提供程序和自定义sql上发疯。

获取一个支持Oracle(如NHibernate)的ORM,让它来完成工作。你唯一关心的是将表映射到你的对象,然后用一种中立的语言编写查询(现在nhibernate支持linq和lambda表达式,所以它不可能比这更容易)。

快乐编码:)

与ADO。如果Oracle驱动程序没有显示在ODBC小程序中,我不会感到惊讶-您正在使用OLEDB连接,这与ODBC不同。

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

请看下面的示例代码: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

我是这样做的,但需要找到新的方法,因为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
   }

}