2011-05-17 9 views
1

J'ai une machine Windows XP utilisé pour créer des applications .Net avec VS 2008.avec connexion oracle C#

Je veux me connecter à un serveur de réseau distant (sous Windows XP) qui exécute une base de données Oracle 10g . J'utilise le code ci-dessous (avec la première chaîne de connexion) pour me connecter directement à une version de 10g qui fonctionne sur la même machine sans problème, mais quand j'essaie de me connecter à la machine du réseau, elle se bloque mon application.

J'ai essayé plusieurs variantes de chaînes de connexion car je pense que je dois faire une erreur de syntaxe quelque part. Ce qui me préoccupe, c'est que j'ai des instructions try/catch doubles dans l'application et je ne comprends pas pourquoi il ne refuse tout simplement pas la connexion et signale l'erreur.

Je suppose que la vraie question est "quelle est la syntaxe correcte pour la chaîne de connexion" .... ou quoi que ce soit l'enfer je fais mal.

Toute aide ou suggestion est grandement appréciée. Merci d'avance.

//Class Variables 
string CONNSTR = "Server=192.168.0.1:1521;User ID=zahid;Password=abc123;"; 


public Oracle() 
{ 
    InitializeComponent(); 
} 

//Methods 
private void TestMyOracleConnection() 
{ 
    OracleConnection Conn = new OracleConnection(CONNSTR); 
    try 
    { 
    Conn.Open(); 
    MessageBox.Show("Oracle Connection Established", "Success"); 
    } 
    catch (OracleException ex) 
    { 
    MessageBox.Show(ex.Message, "Oracle Connection Failed!"); 
    } 
    catch (Exception ex) 
    { 
    MessageBox.Show(ex.Message, "Oracle Connection Failed!"); 
    } 
    finally 
    { 
    Conn.Close(); 
    MessageBox.Show("Oracle Connection Closed", "Success"); 
    } 
} 

private void buttonTestConnection_Click(object sender, EventArgs e) 
{ 
    TestMyOracleConnection(); 
} 
+0

Qu'est-ce que j'ai deux try/déclarations de captures accessoires »signifie? Il n'y a qu'un bloc d'essai ici, avec plusieurs lignes non couvertes par celui-ci. Quand il bloque votre application, sort-il une trace de pile? Ça dit quoi? – forsvarir

+0

Il est possible qu'il plante en code natif, 'try..catch' pourrait ne pas être capable de l'attraper. Avez-vous essayé d'autres versions d'Oracle Client? –

Répondre

1

En supposant que vous utilisez ODP.Net, vous pouvez essayer une chaîne de connexion tels que les suivants (extrait d'un web.config):

<add name="OdpConnection" connectionString="Data Source=xe;User Id=some_user;Password=some_password; Promotable Transaction=local" 
    providerName="Oracle.DataAccess.Client" /> 

Vous pouvez lire cette chaîne de connexion du web.config dans votre code en utilisant quelque chose comme ceci:

string connectionString = ConfigurationManager.ConnectionStrings["OdpConnection"].ConnectionString; 

Il est une bonne pratique pour éviter de mettre les chaînes de connexion directement dans le code, car les changer nécessite une re- compiler. En les mettant dans un fichier de configuration, tel que web.config ou app.config, vous pouvez les modifier sans avoir à re-compiler votre bibliothèque ou exe.

1

Vous pourriez vouloir essayer quelque chose comme:

chaîne de connexion

:

Data Source=DBNAME;User ID=zahid;Password= abc123;Persist Security Info=True;Unicode=True; 

Regardez maintenant dans le fichier tnsname.ora sur votre PC. Ce sera quelque part sous votre installation Oracle Client locale. Vous cherchez quelque chose comme:

DBNAME = 
    (DESCRIPTION = 
    (ADDRESS_LIST = 
     (ADDRESS = (PROTOCOL = TCP)(HOST = OracleServerName)(PORT = 1510)) 
     (ADDRESS = (PROTOCOL = TCP)(HOST = OracleServerName)(PORT = 1514)) 
    ) 
    (CONNECT_DATA = 
     (SERVICE_NAME = DBNAME) 
    ) 
) 

Vous cherchez à remplacer DBNAME et OracleServerName avec votre propre. Ne pas oublier, DBNAME est le nom de la base de données principale, pas un des schémas (l'entité avec toutes les tables et procédures, etc) en vertu de celui-ci.

1
try 
    { 
    Conn.Open(); 
    MessageBox.Show("Oracle Connection Established", "Success"); 
    } 
    catch (OracleException ex) 
    { 
    MessageBox.Show(ex.Message, "Oracle Connection Failed!"); 
    } 
    catch (Exception ex) 
    { 
    MessageBox.Show(ex.Message, "Oracle Connection Failed!"); 
    } 
    finally 
    { 
    Conn.Close(); 
    MessageBox.Show("Oracle Connection Closed", "Success"); 
    } 

Vous avez un problème pottential ici: si conn.Open() échoue (si la connexion est pas ouvert) en enfin vous appelez conn.close(), mais la connexion n'est pas ouvert - il échoue aussi, mais il est maintenant dehors essayer de prendre.Vous devez vérifier

if (Conn!=null && Conn.IsOpen()) 
    Conn.Close(); 

Chaîne de connexion pour Oracle: Data Source = TORCL; ID utilisateur = myusername; Mot de passe = myPassword; Source des données = (DESCRIPTION = (ADRESSE_LIST = (ADRESSE = (PROTOCOLE = TCP) (HOST = MyHôte) (PORT = MyPort))) (CONNECT_DATA = (SERVEUR = DÉDIÉ) (SERVICE_NAME = MyOracleSID))); Id = myUsername; Password = monPassword;

More here