|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Apr 2008
Messaggi: 101
|
[C#] Interazione fra C# e database SQL Server!
Ciao a tutti!
Mi trovo di fronte a un problema che cerco di risolvere ormai da diversi giorni. Premetto che sono ancora uno studente e le mie conoscenze di programmazione (sopratutto se di mezzo c'è del SQL) non sono ancora proprio delle migliori! ![]() ![]() Sto sviluppando un'applicativo C# in WPF che mi memorizzi e carichi dei dati da un database SQL Server da e nel mio programma. Ho generato le Query GetData() e Fill() e la prima di esse funziona perfettamente. Il mio problema sta nel Fill(): la Query SQL che mi fal'INSERT dei dati nel database è esatta (se infatti provo tramite Query Builder --> Execute Query funziona tutto e mi riempie la mia Table tblFilm senza problemi con una nuova row). Ma come faccio a farlo tramite codice C#?? Sarà che faccio un gran casino fra sti TableAdapter, DataSet, DataTable, DataRow, ecc..!! ![]() Al momento il mio codice in C# gira e non da errore, ma non fa proprio un bel niente!! ![]() Qualcuno ha anche solo un codice generico per fare la Fill in un db? La parte C# che non va è la seguente: Codice:
tblFilmTableAdapter adapt = new tblFilmTableAdapter(); DsDataFilm.tblFilmDataTable table = new DsDataFilm.tblFilmDataTable(); //il mio DataSet DataRow row = table.NewtblFilmRow(); row["TITOLO"] = "Prova"; row["ANNO"] = 1988; row["GENERE"] = "Action"; row["RATING"] = 5; row["TRAMA"] = "asdfghjklpoi"; row["LOCANDINA"] = "url:\\locandina.jpg"; adapt.FillBase(table, 4); //Fill della table fatta prima nella row con ID = 4.. (@Param1) ![]() ![]() Ho in realtà due metodi Fill (Fill e FillBase) uno che accetta una table e l'altro che accetta ogni singolo parametro. Nessuno dei due tramite C# va.. ![]() In definitiva.. come faccio a creare una nuova row e a metterci tutti i miei dati?? ![]() Qualcuno sa darmi una dritta? ![]()
__________________
CPU: Intel Core 2 Quad Q8400@3.30Ghz cooled by Cooler Master Gemini II (413x8, FSB@1652Mhz, 1.44v) MB: Gigabyte GA-P45-UD3LR Ram: 4GB DDR2@826Mhz (5-7-7-20) Sk Video: XFX8800GT A.D. Edition XXX (GPU: 670Mhz, MEM: 1950Mhz, GDDR3 512Mb) HDD: 2xMaxtor DiamondMax 160GB 8Mb 7200rpm + Seagate 1Tb Alimentatore: Corsair TX650W Schermo: LCD ASUS VW222 22" Casse: Creative 5.1 S.O.: Windows 7 Ultimate 64bit Adsl (Down/Up): Fastweb 7Mbit / 512Kb Multimedia HDD: Iomega ScreenPlay Director HD 1Tb Ultima modifica di J0k3r91 : 15-02-2010 alle 16:57. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Non prenderla come una "critica", ma francamente non vedo il perchè di tanta complicazione per fare una Insert su una tabella sola.
Il fatto che i DataSet siano il cuore di ADO.NET non significa che sia sempre obbligatorio farne uso. Provato con un semplicissimo SqlCommand ? http://www.codeproject.com/KB/databa...in_csharp.aspx |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Apr 2008
Messaggi: 101
|
Ciao MarcoGG.
Il fatto è che i DataSet li DEVO utilizzare perchè sono parte dell'esercizio che dobbiamo svolgere! ![]() Altrimenti l'avrei fatto prima.. ![]() Quindi, sempre utilizzando il DataSet.. come potrei fare ![]() ![]()
__________________
CPU: Intel Core 2 Quad Q8400@3.30Ghz cooled by Cooler Master Gemini II (413x8, FSB@1652Mhz, 1.44v) MB: Gigabyte GA-P45-UD3LR Ram: 4GB DDR2@826Mhz (5-7-7-20) Sk Video: XFX8800GT A.D. Edition XXX (GPU: 670Mhz, MEM: 1950Mhz, GDDR3 512Mb) HDD: 2xMaxtor DiamondMax 160GB 8Mb 7200rpm + Seagate 1Tb Alimentatore: Corsair TX650W Schermo: LCD ASUS VW222 22" Casse: Creative 5.1 S.O.: Windows 7 Ultimate 64bit Adsl (Down/Up): Fastweb 7Mbit / 512Kb Multimedia HDD: Iomega ScreenPlay Director HD 1Tb |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
http://msdn.microsoft.com/it-it/libr...3x(VS.80).aspx Il fatto che dichiari nel tuo post iniziale che il codice C# gira senza errori, ma a DB "non fa niente", mi fa pensare ad una dimenticanza di questo genere... |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Spero che sia un esercizio scolastico e non universitario, perchè programmare ad un solo livello, diciamo 1+ un wrapper, non è proprio il massimo, gestendo di fatto la persistenza dallo strato presentazione.
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
Quote:
![]() (resta cmq una porcata eh) |
|
![]() |
![]() |
![]() |
#9 | |
Member
Iscritto dal: Apr 2008
Messaggi: 101
|
Quote:
![]()
__________________
CPU: Intel Core 2 Quad Q8400@3.30Ghz cooled by Cooler Master Gemini II (413x8, FSB@1652Mhz, 1.44v) MB: Gigabyte GA-P45-UD3LR Ram: 4GB DDR2@826Mhz (5-7-7-20) Sk Video: XFX8800GT A.D. Edition XXX (GPU: 670Mhz, MEM: 1950Mhz, GDDR3 512Mb) HDD: 2xMaxtor DiamondMax 160GB 8Mb 7200rpm + Seagate 1Tb Alimentatore: Corsair TX650W Schermo: LCD ASUS VW222 22" Casse: Creative 5.1 S.O.: Windows 7 Ultimate 64bit Adsl (Down/Up): Fastweb 7Mbit / 512Kb Multimedia HDD: Iomega ScreenPlay Director HD 1Tb |
|
![]() |
![]() |
![]() |
#10 | |
Member
Iscritto dal: Apr 2008
Messaggi: 101
|
Quote:
![]() Non so dove andare a parare.. ![]()
__________________
CPU: Intel Core 2 Quad Q8400@3.30Ghz cooled by Cooler Master Gemini II (413x8, FSB@1652Mhz, 1.44v) MB: Gigabyte GA-P45-UD3LR Ram: 4GB DDR2@826Mhz (5-7-7-20) Sk Video: XFX8800GT A.D. Edition XXX (GPU: 670Mhz, MEM: 1950Mhz, GDDR3 512Mb) HDD: 2xMaxtor DiamondMax 160GB 8Mb 7200rpm + Seagate 1Tb Alimentatore: Corsair TX650W Schermo: LCD ASUS VW222 22" Casse: Creative 5.1 S.O.: Windows 7 Ultimate 64bit Adsl (Down/Up): Fastweb 7Mbit / 512Kb Multimedia HDD: Iomega ScreenPlay Director HD 1Tb |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quoto.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Chi ha imparato a sfruttare le potenzialità dei DataSet penso non sia molto d'accordo. Sarà che io resto sempre scettico, e abbastanza "divertito" di fronte ad affermazioni come queste, se si rimane nel contesto italiano, dove vai ad un corso e senti il docente di turno dire "...è una tecnica di sviluppo ormai superata e... blah blah blah...", poi vai a fare un colloquio in una signora azienda, almeno sulla carta, e ti senti dire che hanno bisogno di un tizio che faccia classi in Java o .NET, che devono processare "tracciati record" in formato testo, che escono dal gestionale, al quale ovviamente nessuno vuole mettere mano, e che è scritto... in Cobol. ![]() |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
I Dataset saranno effettivamente funzionali e produttivi soprattutto per programmatori poco esperti, ma di certo non sono il miglior esempio( soprattutto in ambito di flessibilità, scalabilità e riutilizzo) di programmazione.
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Ma l'Update l'hai fatto correttamente come nell'esempio alla pagina Msdn che ti ho linkato ?
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Un Dataset non tipizzato è un incubo da gestire in un applicativo di una certa complessità, non sai mai chi ci ha messo le mani sopra e finchè non arrivi a spulciare la query di lettura e tutta l'elaborazione che c'è stata fatta sopra non sai cosa c'è dentro. Proprio la condizione ideale per qualunque business layer. Mi sta capitando in questi giorni di mettere mano ad un progetto corposo (spacciato per essere in .NET 3.5) che fa uso esclusivo di Dataset non tipizzati in ogni punto ed è tutto un andare a cercare l'origine del dataset per sapere con cosa è stato valorizzato e successivamente da chi viene elaborato e tutto questo solo per conoscere cosa può esserci dentro quella scatola nera. Ma nessuno mi garantisce che una modifica alla query di partenza o qualche punto a valle non faccia poi schiantare il software in un punto remoto solo perchè non c'è più l'informazione che cercavo, stai sicuro che non riceverai nessun errore in compilazione e probabilmente anche l'Unit Test non ti porrà al riparo dagli errori, dovresti confidare nei test di integrazione (di difficile realizzazione se i punti da testare hanno diversi componenti che li separano). Metti poi che in un database aziendale leggi con Viste e scrivi con Stored, che non sono impiegabili nei webservice, a meno di non dare per scontato che il client sia in .NET e che chi sviluppa il client vada a spulciare il sorgente del webservice solo per capire cosa gli è stato ritornato. Ce n'è abbastanza per relegarli al passato. |
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
La tabella sul DB è "tblFilm". > Dichiarazioni : Codice:
private OleDbDataAdapter DA = new OleDbDataAdapter(sqlSelect, CN); private DataSet DS = new DataSet(); CN è la Connection e DS è un semplice DataSet, quindi inutile scomodare altri oggetti, metodi strani, ecc. per gestire una tabella... > Fill del DataSet ( viene fatto una volta sola all'avvio dell'applicazione ) e sua rappresentazione su un DataGridView : Codice:
DA.Fill(DS); DataGridView1.DataSource = DS.Tables[0]; Codice:
DataRow nuovaRiga = DS.Tables[0].NewRow(); int nuovoID = Convert.ToInt32(DS.Tables[0].Compute("MAX(ID)", null)) + 1; nuovaRiga["ID"] = nuovoID; nuovaRiga["TITOLO"] = "Titolo"; nuovaRiga["ANNO"] = 2010; nuovaRiga["GENERE"] = "Genere"; nuovaRiga["RATING"] = 5; nuovaRiga["TRAMA"] = "Trama"; nuovaRiga["LOCANDINA"] = "Locandina"; DS.Tables[0].Rows.Add(nuovaRiga); if(DS.HasChanges()==true) { using(OleDbCommandBuilder CB = new OleDbCommandBuilder(DA)) { DA.UpdateCommand = CB.GetUpdateCommand(); DA.InsertCommand = CB.GetInsertCommand(); DA.DeleteCommand = CB.GetDeleteCommand(); DA.Update(DS); } } DS.AcceptChanges(); MessageBox.Show("Modifiche Salvate"); - Ovviamente anche qui sostituire con SqlCommandBuilder ecc... Perciò, come già detto, niente di trascendentale. Non so se la complessità della tua impostazione ( definizione di oggetti e metodi vari... ) faccia parte dell'esercizio. Se l'unico requisito è "usate un DataSet", qui hai forse l'esempio più immediato che ti si possa fornire. ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:46.