2011-11-16 6 views
0

J'apprécierais tout conseil pour résoudre ce problème.
Je ne suis pas un développeur pro mais un "amateur" qui a "hérité" d'un travail de reportage (grâce à mon intérêt pour la programmation - exemple classique de 'jamais volontaire'!). J'essaie d'accéder à une base de données Oracle 10g à partir de C#.
Pour garder les choses aussi simples que possible, j'ai un formulaire WPF avec un seul bouton. Dans l'événement de clic du bouton, j'ai le code suivant (qui, soit dit en passant a bien fonctionné dans un programme antérieur mis en place sur un autre PC) -Accès Oracle à partir du programme C#

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(); 
    } 

maintenant ... la L'application (C# Express Edition) s'exécute dans une machine virtuelle sur un serveur distant. Mon partager sur cette machine virtuelle avait également installé Oracle Database 10g Client Release 2 (10.2.0.1.0).

En outre, j'ai installé les composants Oracle Data Access par le département informatique. Lorsque vous exécutez ODBCAD32 dans la machine virtuelle, aucun pilote Oracle n'est répertorié dans l'onglet Pilotes.

Je crois que le pilote installé a échoué et cela empêche mon programme d'initier toute connexion. Cependant, je n'ai aucune preuve et me demandais si les savants ici pourraient conseiller d'en obtenir ...?

Les premières lignes du message d'erreur IDE lecture -

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()  

Désolé d'être si longue haleine, mais comme vous pouvez le voir, ce set-up est assez complexe ... :)

Je ne suis pas qualifié pour dire à IT leur travail, mais apprécierait conseils que je pourrais transmettre?

Répondre

0

Je recommande de ne pas devenir fou avec les fournisseurs de données et SQL personnalisé. Obtenez un ORM qui prend en charge Oracle (comme NHibernate) et laissez-le faire. Votre seule préoccupation sera de mapper les tables à vos objets, puis d'écrire des requêtes avec un langage neutre (maintenant nhibernate supporte les expressions linq et lambda, donc il ne pourrait pas être plus facile que cela).

:) Bonne programmation

0

Avec ADO.Net, je ne serais pas surpris que les conducteurs d'Oracle ne sont pas affichés dans l'applet ODBC - vous utilisez une connexion OLEDB, qui est un animal différent de ODBC. Il semble que vous utilisiez System.Data.OracleClient, qui est le client Oracle de Microsoft, et non Oracle Corp. - Ce client est obsolète (Microsoft cessera de le prendre en charge dans le futur), et je le ferais ne recommande pas que vous l'utilisiez.

Jetez un oeil à l'exemple de code ici: http://www.carlprothman.net/Default.aspx?tabid=86#OracleNETDataProviderFromOracle

ou ici:

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

Voici quelques chaînes de connexion exemple: http://www.connectionstrings.com/oracle

0

Voici comment je le fais mais besoin de trouver de nouvelles façons car une partie d'OracleClient est obsolète dans 4.0 et 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 
    } 

}

Questions connexes