Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Per diversi giorni il Galaxy S26 Ultra di Samsung è stato il nostro compagno di vita. Oltre alle conferme del colosso coreano come la qualità del display e una suite AI senza rivali, arriva il Privacy Display, un unicum nel mondo smartphone. Ci sono ancora alcuni gap che non sono riusciti a colmare lato batteria e fotocamera, seppur con alcuni miglioramenti.
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Abbiamo provato per voi il nuovo DLC lanciato a sorpresa da Blizzard per Diablo II: Resurrected e quella che segue è una disamina dei nuovi contenuti che abbiamo avuto modo di sperimentare nel corso delle nostre sessioni di gioco, con particolare riguardo per la nuova classe dello Stregone
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Siamo tornati nel parco tecnologico di Trieste per il kick-off del programma che mette a disposizione di cinque startup le infrastrutture di ricerca, dal sincrotrone Elettra ai laboratori di genomica e HPC. Roberto Pillon racconta il modello e la visione
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-03-2007, 13:23   #1
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
[C#/MySql]mi serve un guru!



Son due giorni che sbatto contro un problema

Allora...

In base a determinate scelte effettuate su un form da parte dell'utente, viene creata una tabella in un database mysql. Questo significa che detta tabella non avrà mai lo stesso numero di colonne e/o lo stesso tipo. Nel caso l'utente faccia la stessa identica scelta, la tabella viene droppata e ricreata. Fin qui, nessun problema, ho gestito il codice che mi fa tutto questo...

Poi, l'utente decide di visualizzare i dati contenuti in questa tabella appena creata, ed anche qui nessun problema, mediante il fantastico oggetto DataGridView, ho gestito il codice necessario a visualizzare i dati su una splendida griglia.

I problemi iniziano adesso....ovvero quando l'utente decide di cambiare qualcosa o di fare un inserimento nuovo all'interno di questa tabella.
Non posso gestire delle query di INSERT o UPDATE perchè a priori non mi è assolutamente noto il numero di campi che conterrà la tabella (ricordando che viene creata a run time in base a delle scelte del momento da parte dell'utente).

Girovagando in rete, ho visto che il connettore di MySql per .NET, fornisce potenti mezzi per ovviare a questo inconveniente. Uno di questi è il MySqlDataAdapter, che ha un metodo Update() strettamente legato con l'utilizzo di un DataGridView e di un DataSet, e un altro è il MySqlCommandBuilder che si preoccupa da solo, una volta legato al data adapter, di creare i comandi necessati di insert, delete e update. Funziona così:

Codice:
string connessioneDb = "gestisco_la_connessione";
MySqlConnection cn = new MySqlConnection(connessioneDb);
cn.Open();
string selectFromTable = "SELECT * FROM mia_random_tabella";
MySqlDataAdapter adapter = new MySqlDataAdapter(selectFromTable);
DataSet ds = New DataSet();
adapter.Fill(ds, "mia_random_tabella");
//dico alla griglia di prendersi i dati dagli oggetti mysql
griglia.DataSource = ds;
griglia.DataMember = "mia_random_tabella";

//ora, qui dovrei gestire gli eventuali cambi che faccio sulla griglia per restituirli al db

MySqlCommand builder myCommand = New MySqlCommandBuilder(adapter);
adapter.Update(ds, "mia_random_tabella");
//per semplicità nn ho messo il tutto nei vari try_catch_finally
Questo codice, trovato più volte in rete, anche sul sito msdn, non mi funziona affatto

Ho provato una marea di combinazioni ma senza successo.

Per favore, datemi una mano

Grazie.

RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 13:32   #2
Xalexalex
Senior Member
 
L'Avatar di Xalexalex
 
Iscritto dal: Jan 2006
Città: Pisa
Messaggi: 2503
Sono a digiuno da parecchio di programmazione, però così su due piedi la prima idea che mi verrebbe è salvare in un'altra tabella, righe e colonne di ogni tabella generata dall'utente, e poi comportarsi di conseguenza...
__________________
Xalexalex è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 13:44   #3
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da Alessandro::Xalexalex Guarda i messaggi
Sono a digiuno da parecchio di programmazione, però così su due piedi la prima idea che mi verrebbe è salvare in un'altra tabella, righe e colonne di ogni tabella generata dall'utente, e poi comportarsi di conseguenza...
sarebbe impensabile, se l'utente genera dodici tabelle dovrei gestire dodici query per un numero non prevedibile di colonne
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 14:00   #4
Xalexalex
Senior Member
 
L'Avatar di Xalexalex
 
Iscritto dal: Jan 2006
Città: Pisa
Messaggi: 2503
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
sarebbe impensabile, se l'utente genera dodici tabelle dovrei gestire dodici query per un numero non prevedibile di colonne
Allora più di così non so aiutarti, mi spiace
Buona fortuna comunque
Alex
__________________
Xalexalex è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 15:04   #5
Riordian
Senior Member
 
L'Avatar di Riordian
 
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
Io di solito non uso questo metodo per aggiornare le tabelle ma mi creo delle query utilizzando l'oggetto command,
comunque mi sembra di ricordare che se fai delle modifiche su un dataset poi devi chiamare il metodo AcceptChanges o qualche cosa del genere, altrimenti il dataset rimane nello stato originario.
__________________
tag XBOX live Aldair74
Nick PSNRiordian
Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db
Riordian è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 15:24   #6
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da Riordian Guarda i messaggi
Io di solito non uso questo metodo per aggiornare le tabelle ma mi creo delle query utilizzando l'oggetto command,
comunque mi sembra di ricordare che se fai delle modifiche su un dataset poi devi chiamare il metodo AcceptChanges o qualche cosa del genere, altrimenti il dataset rimane nello stato originario.
Eh.. magari potessi utilizzare unq query. Sono impossibilitato perchè non conosco a priori ne il numero di colonne ne il nome delle colonne che formano la tabella, dato che quest'ultima, viene generata a run time dall'utente.

Per il metodo del dataset, l'ho già provato, ma non funziona
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 15:29   #7
Riordian
Senior Member
 
L'Avatar di Riordian
 
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Eh.. magari potessi utilizzare unq query. Sono impossibilitato perchè non conosco a priori ne il numero di colonne ne il nome delle colonne che formano la tabella, dato che quest'ultima, viene generata a run time dall'utente.

Per il metodo del dataset, l'ho già provato, ma non funziona
Beh, genera runtime anche la query, il nome delle colonne delle tabelle dovrebbero essere uguali a quelle del db no?
__________________
tag XBOX live Aldair74
Nick PSNRiordian
Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db
Riordian è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 15:41   #8
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da Riordian Guarda i messaggi
Beh, genera runtime anche la query, il nome delle colonne delle tabelle dovrebbero essere uguali a quelle del db no?
Si, in effetti è l'unica cosa che credo possibile. Ma.... c'è un piccolo dettaglio, come faccio a farlo a runtime?

Nel senso che la tabella che crea l'utente, potrebbe avere tanto 30 campi, tanto 5, tanto 18. Il nome dei campi lo posso vedere solo attraverso il nome delle colonne del datagridview. Ma scorrere ogni singolo contenuto delle colonne e delle righe del datagridview, per inserirli nella tabella del db, va oltre le mie capacità. Ti sarei grato se potessi farmi un esempio.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 16:07   #9
Riordian
Senior Member
 
L'Avatar di Riordian
 
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Si, in effetti è l'unica cosa che credo possibile. Ma.... c'è un piccolo dettaglio, come faccio a farlo a runtime?

Nel senso che la tabella che crea l'utente, potrebbe avere tanto 30 campi, tanto 5, tanto 18. Il nome dei campi lo posso vedere solo attraverso il nome delle colonne del datagridview. Ma scorrere ogni singolo contenuto delle colonne e delle righe del datagridview, per inserirli nella tabella del db, va oltre le mie capacità. Ti sarei grato se potessi farmi un esempio.
Non ho però capito molto bene il problema, cioè tu crei una tabella vuota nel db e poi inizi a riempirla, ok?
La prima volta va tutto bene ed i problemi nascono le volte successive che inserisci nel db,
ma allora per fare tanti rigiri, non conviene dropparsi e ricreare la tabella ogni volta?
Comunque ho idea che queste strade siano abbastanza lente. Comunque dovrebbe essere una cosa del genere

Codice:
//cominciare una transazione

//cancella tutte le righe dalla tabella

foreach (datarow r in table.Rows)
{
   string insert="insert into tabella (";
   string values=")VALUES(";
   foreach(datacolumn c in table.Columns)
  {
    insert+=c.ColumnName +",";
    values+="'" + r[c.ColumnName] + "',";
  }
  insert=insert.trimEnd(',') + values.trimEnd(',') + ")";
  //esecuzione del comando

}

//chiudi la transazione

tutto messo sotto un bel blocco try catch ovviamente.
Ho però alcuni dubbi:
1) se la mole di dati fosse grande le prestazioni farebbero pena (il dataadapter credo sarebbe più veloce ma non lo ho mai usato)
2) forse le colonne autogenerate potrebbero dare dei problemi

Tieni conto che ci saranno sicuramente degli errori in compilazione.
__________________
tag XBOX live Aldair74
Nick PSNRiordian
Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db

Ultima modifica di Riordian : 29-03-2007 alle 16:10.
Riordian è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 16:16   #10
Riordian
Senior Member
 
L'Avatar di Riordian
 
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
mi è venuto un altro dubbio rispetto al tuo primo post, il dataset, quando modifichi la datagrid viene aggiornato automaticamente? Se non fosse così, il tuo problema potrebbe essere questo.
__________________
tag XBOX live Aldair74
Nick PSNRiordian
Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db
Riordian è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 16:29   #11
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da Riordian Guarda i messaggi
mi è venuto un altro dubbio rispetto al tuo primo post, il dataset, quando modifichi la datagrid viene aggiornato automaticamente? Se non fosse così, il tuo problema potrebbe essere questo.
E' appunto questo il problema principale. Se sapessi come "sincronizzare" il dataset con i dati presenti nel datagridview sarei apposto

Sul tuo esempio, stavo facendo qualcosa di analogo nell'evento Cell_EndEdit del datagridview, ma le prestazioni sono davvero penose

Quote:
Non ho però capito molto bene il problema, cioè tu crei una tabella vuota nel db e poi inizi a riempirla, ok?
La prima volta va tutto bene ed i problemi nascono le volte successive che inserisci nel db,
ma allora per fare tanti rigiri, non conviene dropparsi e ricreare la tabella ogni volta?
Infatti la tabella viene droppata e ricreata ogni volta, se l'utente crea una tabella con le stesse scelte già effettuate in passato.
La tabella inizialmente non è vuota, ha già dei dati che derivano da delle view su altre tabelle. Perciò l'utente può crearsi la sua tabella personalizzata in base a scelte fatte anche da altri utenti.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek

Ultima modifica di RaouL_BennetH : 29-03-2007 alle 16:31.
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 16:45   #12
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
oltretutto, non riesco ad identificare un errore di sintassi che mi viene da:

Codice:
string update = "UPDATE T";

for(int count = 2; count < lastColumn; count++)
{
    update += " SET 'D" + (count - 1 ) + "' = ' " + dataGridView.Rows[e.RowIndex].Cells[count].Value + "' ";
}
update += "WHERE ID_Job = '" + dataGridView.Rows[e.RowIndex].Cells[0].Value + "' ";

......
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 16:51   #13
Riordian
Senior Member
 
L'Avatar di Riordian
 
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
oltretutto, non riesco ad identificare un errore di sintassi che mi viene da:

Codice:
string update = "UPDATE T";

for(int count = 2; count < lastColumn; count++)
{
    update += " SET 'D" + (count - 1 ) + "' = ' " + dataGridView.Rows[e.RowIndex].Cells[count].Value + "' ";
}
update += "WHERE ID_Job = '" + dataGridView.Rows[e.RowIndex].Cells[0].Value + "' ";

comunque hai problemi anche sul sql, il set va furi dal for ;-)

......
sintassi c# o sql? io comunque metterei
update += " SET 'D" + (count -1).ToString() + .......
crei male la stringa sql.
Codice:

string update = "UPDATE T SET ";

for(int count = 2; count < lastColumn; count++)
{
    update += " 'D" + (count - 1 ).ToString() + "' = ' " + dataGridView.Rows[e.RowIndex].Cells[count].Value + "' ,";
}
update = update.TrimEnd(',');
update += " WHERE ID_Job = '" + dataGridView.Rows[e.RowIndex].Cells[0].Value + "' ";



......
sulle prestazioni immaginavo
__________________
tag XBOX live Aldair74
Nick PSNRiordian
Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db

Ultima modifica di Riordian : 29-03-2007 alle 16:56.
Riordian è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 16:55   #14
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da Riordian Guarda i messaggi
sintassi c# o sql? io comunque metterei
update += " SET 'D" + (count -1).ToString() + .......

sulle prestazioni immaginavo

L'errore me lo da sulla sintassi di MySql. Il metodo ToString() l'avevo già messo, e anzi, all'inizio credevo fosse quello, ma anche togliendolo, il risultato non cambia. Mi da sempre:

"You have an error in your SQL Syntax; check the manual that corresponds to your MySqlS server version for the right syntax to use near ''D1 = '6.00' SET 'D2' = '1.00' SET 'D3' = '' " etc......
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 16:59   #15
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
CHe pirla... in questo caso avevo solo dimenticato 'qualche virgola.... '
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 17:17   #16
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Niente

Quel 'for' non mi viene
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 17:31   #17
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Almeno, il problema del for l'ho risolto. Mettevo erroneamente il valore del nome della colonna della tabella fra singoli apici.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2007, 17:59   #18
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Al momento riesco a fare quello che mi serve in questo modo:

Codice:
try
{
  using(MySqlConnection cn = ConnClass.Create())
  {
     string update = "UPDATE " + myRandomTable + " SET ";
     for(int count = 2; count < lastColumn; ++count)
     {
          if(myGrid.Rows[e.RowIndex].Cells[count].Value != null)
          {        
             update += " D"+ (count - 1) " = '" + myGrid.Rows[e.RowIndex].Cells[count].Value + "' ";
             update += ",";
          }
     }
     update += "WHERE ID_Job = '" + myGrid.Rows[e.RowIndex].Cells[0].Value + "' ";
     MySqlCommand performUpdate = new MySqlCommand(update, cn);
     performUpdate.ExecuteNonQuery();
     if( cn != null)
     {
         cn.Close();
         cn.Dispose();
     }
   }
}
catch(MySqlException)
{
    Throw
}
Resto in attesa dei vostri preziosi suggerimenti.


RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
I migliori smartphone in offerta ora su ...
Le migliori TV delle Offerte di Primaver...
Uno dei robot più avanzati del 2025 crol...
Robot aspirapolvere con stazione automat...
Il nuovo top di gamma compatto di OPPO n...
Nilox aggiorna la sua gamma di fat e-bik...
Meta valuta tagli fino al 20% della forz...
MacBook Neo sorprende iFixit: 'Non vedev...
Venus Optics presenta due nuovi obiettiv...
AMD pubblica una guida per eseguire Open...
Tomb Raider I-III Remastered arriva su A...
X fa marcia indietro: si adeguerà...
Framework e la crisi delle memorie: terz...
Doom è ovunque: perché il ...
NVIDIA aggiorna G-Sync Pulsar: migliorat...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:43.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v