Problema con Datatable [C#]

venerdì 31 agosto 2007 - 09.29

vanna Profilo | Newbie

Salve a tutti, innanzitutto mi scuso se ho sbagliato sezione (è il mio primo topic!).
Sto sviluppando un'applicazione Windows in C# mediante l'utilizzo di Visual Studio Express.
Sto lavorando con un database MySQL configurato e creato da me, e sto utilizzando il MySQL connector per il .NET.
Mi sono creato un oggetto DbManager che si occupa di gestire tutta la comunicazione/scambio dei dati tra il database e l'applicazione che sto sviluppando.
Tutto procede abbastanza bene, ma sono incappato in un errore strano, ovvero:

public DataTable GetTabella(string query) { comando.CommandText = query; tabella.Rows.Clear(); tabella.Columns.Clear(); adapter.SelectCommand = comando; adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; try { adapter.Fill(tabella); } catch (Exception e) { MessageBox.Show(e.ToString()); } return tabella; }

ho scritto in questa classe un semplice metodo che mi ritorna un datatable con i dati richiesti dall'istruzione SQL.
Il problema non è in questo frammento di codice, in quanto in fase di debug funziona correttamente (nel senso che tira fuori i dati in maniera corretta).

Il nocciolo della questione è qui:
public partial class Detail : Form { DbManager dbman; DataTable sedi; DataTable referenti; string query; public Detail() { InitializeComponent(); } private void detail_Load(object sender, EventArgs e) { dbman = new DbManager(NomeUtente, Password); query = "testo della query" sedi = dbman.GetTabella(query); grdSedi.DataSource = sedi; query = "testo della query" referenti = dbman.GetTabella(query); grdReferenti.DataSource = referenti; }
per inciso, questa è una form con due controlli DataGridView (grdSedi e grdReferenti). Quando io richiamo il metodo GetTabella() la prima volta mi associa al DataTable sedi i dati corretti e poi li immette nel DataGridView grdSedi. Alla seconda operazione sempre del metodo GetTabella() ritorna sul DataTable referenti i dati giusti, ma la cosa stranissima è che questi dati me li scrive pure sul primo DataTable!
Quindi io alla fine mi ritrovo con due DataTable (referenti e sedi) con dentro i dati dell'ultima lettura del DataAdapter.
Spero d'essere stato comprensibile...in attesa di qualche aiuto! =D

amelix Profilo | Expert

Una domanda.
Dove e come vengono dichiarate tabella, comando etc nel primo pezzo di codice?
Se lo fai a livello di classe lavori sempre con gli stessi oggetti e quindi devi crearti 2 istanze della stessa classe x avere 2 risultati diversi.

Se tu li avessi dichiarati all'interno del metodo non avresti avuto nessun problema...

PS. Attento alle aperture/chiusure del DB...
Andrea - http://www.MelisWeb.eu/

[OT] Vendo il mio portatile:
http://www.subito.it/vi/1391126.htm

vanna Profilo | Newbie

Tabella, comando e tutto il resto nel primo pezzo di codice sono stati istanziati nel costruttore della classe e ovviamente dichiarati nel corpo della classe stessa.

public class DbManager { private MySqlConnection connessione; private MySqlCommand comando; private MySqlDataAdapter adapter; private DataTable tabella; private string strconnessione; private string percorso; private string nomeUtente; private string password; public DbManager(string nomeUtente, string password) { this.nomeUtente = nomeUtente; this.password = password; this.percorso = "127.0.0.1"; strconnessione = "testo della stringa" connessione = new MySqlConnection(strconnessione); comando = new MySqlCommand(strconnessione); comando.Connection = connessione; adapter = new MySqlDataAdapter(); tabella = new DataTable(); } }

mentre gli altri due DataTable li ho dichiarati all'interno della classe Detail (che è una WindowsForm).

EDIT: avevo omesso la parte iniziale della classe.

amelix Profilo | Expert

Lo avevo intuito...

Se vuoi mantenere la struttura attuale (secondo me uno spreco di risorse....) devi instaziare 2 classi diverse.

dbman1 = new DbManager(NomeUtente, Password); dbman2 = new DbManager(NomeUtente, Password); query = "testo della query" sedi = dbman1.GetTabella(query); grdSedi.DataSource = sedi; query = "testo della query" referenti = dbman2.GetTabella(query); grdReferenti.DataSource = referenti;

Così funziona sicuramente... ma...
Andrea - http://www.MelisWeb.eu/

[OT] Vendo il mio portatile:
http://www.subito.it/vi/1391126.htm

vanna Profilo | Newbie

Capisco...pensavo di poter evitare di dover istanziare un'altra volta la stessa classe.
E sinceramente lo vorrei evitare...
Qualche suggerimento?

amelix Profilo | Expert

Io farei così:

public class DbManager { private MySqlConnection connessione; private string strconnessione; private string percorso; private string nomeUtente; private string password; public DbManager(string nomeUtente, string password) { this.nomeUtente = nomeUtente; this.password = password; this.percorso = "127.0.0.1"; strconnessione = "testo della stringa" connessione = new MySqlConnection(strconnessione); } public DataTable GetTabella(string query) { MySqlCommand comando = new MySqlCommand(connessione); MySqlDataAdapter adapter = new MySqlDataAdapter(); DataTable tabella = new DataTable(); comando.CommandText = query; adapter.SelectCommand = comando; adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; try { adapter.Fill(tabella); } catch (Exception e) { MessageBox.Show(e.ToString()); } finally { //dispose di tutto tranne che x tabella } return tabella; } }
Andrea - http://www.MelisWeb.eu/

[OT] Vendo il mio portatile:
http://www.subito.it/vi/1391126.htm

vanna Profilo | Newbie

Sei stato gentilissimo!
Mi dispiace di averti fatto perdere tempo!
Non sono ancora espertissimo in fatto di programmazione, ma imparerò!
Grazie ancora!

amelix Profilo | Expert

Nessun problema...
Se fossi stato occupato non ti avrei risposto

Ancora benvenuto in questo forum!
Andrea - http://www.MelisWeb.eu/

[OT] Vendo il mio portatile:
http://www.subito.it/vi/1391126.htm
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5