2011-11-16 63 views
0

我希望有任何建议来解决这个问题。
我不是专业开发人员,而是一位“继承”报告工作的“业余爱好者”(感谢我对编程的兴趣 - “从不志愿”的经典示例!)。从C#程序的Oracle访问

我试图从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中运行。 此虚拟机上的我的共享也安装了Oracle数据库10g客户端版本2(10.2.0.1.0)。

另外,我已经安装了由IT部门安装的Oracle数据访问组件。

在虚拟机中运行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他们的工作,但会感谢任何意见我可以传递?

回答

0

我会建议不要疯狂的数据提供商和自定义SQL。

获取支持Oracle的ORM(如NHibernate)并让它完成这项工作。你唯一的担心是将表映射到你的对象,然后用中性语言编写查询(现在nhibernate支持linq和lambda表达式,所以它不会比这更简单)。

编码愉快:)

0

随着ADO.Net,我不会感到惊讶,甲骨文的驱动程序没有出现在ODBC小程序 - 您使用的是OLEDB连接,这是从ODBC不同的动物。

它看起来好像您使用System.Data.OracleClient是Microsoft的Oracle客户端,而不是Oracle Corp的客户端 - 该客户端已被弃用(微软将在未来停止支持它),并且我会不建议你使用它。

看一看示例代码在这里: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

0

这是我如何做,而是需要找到新的方法,因为部分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 
    } 

}