Comment appeler une methode dans une autre Form
Bonjour,
J'écris une application qui me permet d'écrire dans une base Mysql
j'ai une form1 qui et une form2
la form1 est une fenetre d'identification qui me permet de me connecter a la base, une fois la connexion vérifiré j'accede a la form2
dans la form2 j'ai des champs ou je peux ecrire des données sur la base
mais voila mon problème j'obtiens un message d'erreur suivant quand je valide les champs
Citation:
L'exception System.InvalidOperationException n'a pas été gérée
Message=Connection must be valid and open.
Voici le code de la form1:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| namespace WpfApplication1
{
/// <summary>
/// Logique d'interaction pour MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
MySqlConnection wConnexion = new MySqlConnection();
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
// Connexion à la BDD
wConnexion.ConnectionString = "Database=test;Data Source=localhost;User Id="+textBox1.Text +";Password="+ passwordBox1.Password;
// Tenter la connexion sinon afficher un message derreur
try
{
wConnexion.Open();
}
catch (Exception ex)
{
MessageBox.Show("Impossible de se connecter au serveur!");
MessageBox.Show(ex.Message);
}
wConnexion.Close();
Window1 myfen = new Window1();
myfen.Show();
this.Close();
}
private void button2_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void passwordBox1_PasswordChanged_1(object sender, RoutedEventArgs e)
{
}
}
} |
et Voici le code de la form2
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| namespace WpfApplication1
{
/// <summary>
/// Logique d'interaction pour Window1.xaml
/// </summary>
public partial class Window1 : Window
{
MySqlConnection wConnexion = new MySqlConnection();
public Window1()
{
InitializeComponent();
}
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
}
private void button1_Click_1(object sender, RoutedEventArgs e)
{
using (wConnexion)
{
// Instancier lobjet Command
using (MySqlCommand wCommand = wConnexion.CreateCommand())
{
// Définition de la requête
wCommand.CommandText = "INSERT INTO `hibis_t`(`nom` ,`prenom` ,`message`) VALUES (" + textBox1.Text + ", "+ textBox2.Text +"," + textBox3.Text + ")";
//wCommand.CommandText = "UPDATE INTO `hibis_t`(`nom` ,`prenom` ,`message`) VALUES (" + textBox1.Text + ", " + textBox2.Text + "," + textBox3.Text + ")";
// Exécution de la requête
// try
//{
wCommand.ExecuteNonQuery();
//}
//catch (InvalidOperationException)
//{
// MessageBox.Show("Erreur impossible d'écrire dans la table!");
//}
wConnexion.Close();
}
}
}
}
} |
comme vous pouvez le voir je suis obligé de remettre la methode MySqlConnection wConnexion = new MySqlConnection(); une deuxieme fois alors que la connexion a la base est deja active
comment puis je utiliser la methode de la form1 dans la form2 svp?
Merci
Singleton ou ouverture de la connexion systématique ?
Salut !
C'est peut-être mon expérience de développeur Web qui parle, mais j'ai une petite suggestion...
Plutôt que d'utiliser des Singletons, ou une connexion "explicitement" persistante, pourquoi ne pas utiliser la puissance de .NET et des objets de connexion aux données ?
En effet, en .NET, quand un objet est détruit au sens fonctionnel du terme (scope terminé) il reste en réalité tout à fait vivant physiquement, tant que le garbage collector ne lui fait pas sa fête.
Quand on sait ça, on en sait déjà pas mal. Idem pour les cnx.Close()... Ouais ouais, on a demandé à fermer la connexion... En réalité, l'objet .NET est libéré, et la connexion physique à la base est remise en pool...
Donc quand on fait X fois de suite cnx.Open() et cnx.Close(), y compris avec des objets différents, dans des scopes différents, "physiquement", il ne se passe rien : une unique connexion reste ouverte tout ce temps vers le serveur.
A partir de là, colles ta chaîne de connexion en ressource de ton application.
Et ouvre/ferme ta connexion comme tu as fait dans ton Form1 chaque fois que tu en as besoin. Tu n'as pas à te soucier de savoir si tu as laissé la connexion ouverte dans une autre form ou quoi que ce soit. Imagine que cnx.Open() ça fait un "begin transaction" et cnx.Close() ça fait un "commit".
Ca ne touche rien à ta connexion réelle (donc aux perfs) de l'ouvrir et de la fermer, et surtout, tu vas te heurter à tout un tas de problèmes d'accès (dead locks, timeout etc.) si tu commences à vouloir gérer les ouvertures/fermetures de façon fonctionnelle (j'ouvres dans la form1 et je réutilise dans la form2).
Ouvre et ferme dès que tu n'en a plus immédiatement besoin.
J'utilise par exemple dans une application des UserControl qui chargent des listes de données avec un cnx.Open() et cnx.Close() dans chaque user contrôle. Dans certaines forms de mon application, j'ai plusieur centaines de ces UserControls... ça met moins de 1 seconde à s'afficher. Je répète donc, pas de lien direct entre le cnx.Open() et le cnx.Close() et les ouvertures effectives de sessions dans ta base.