View Full Version : [Visual C#] Aiuto operazioni su DB Access 2007
alucard82
25-01-2009, 15:44
Ciao a tutti. Innanzi tutto vorrei precisare ke uso c# da 2 gg (sto usando Visual Studio 2008). Sto provando a scrivere una piccola applicazione che faccia delle semplici funzioni su un database (che ho creato in access 2007 quindi *.accdb) del tipo: mostrare i dati, fare ricerca, aggiungere elementi alle varie tabelle del db e anke l'aggiornamento di alcune tuple nel caso.
Considerando che nn sò usare visual c#, vi spiego cosa ho fatto fino ad ora:
- ho caricato il database da Dati -> Aggiunta nuova origine di dati -> Database -> ho creato una nuova connessione del tipo "File di database Microsoft Access (OLE DB)".
fatto questo mi è apparsa una finestra dove scegliere le mie tabelle e le ho scelte :D. fin qui tutto ok. Poi per visualizzare le tuple delle tabelle nel mio form ho usato un DataGridView. L'ho posizionato sul form, ho scelto le tabelle e se eseguo il programma mi fa vedere le tuple della mia tabella.
Il mio problema lo ho nel momento in cui voglio inserire(o modificare o cancellare) una nuova tupla nel database.
Mi spiego meglio: ho una textbox e un pulsante, e voglio ke quando premo il pulsante mi aggiunga nella tupla quello che sta nella textbox (la tabella ha solo 2 campi ID e FORNITORE). Sono riuscito, facendo qualche prova a casaccio ad aggiungere, solo una riga alla GridView con:
this.memoSNDataSet.Fornitore.AddFornitoreRow(txtFornitori.Text);
(anche se nn sò se è giusto), ma in questo modo mi aggiunge nella gridview nel campo ID un numero negativo e non sò neanche il perchè.
Quindi vi chiedo come faccio ad inserire la tupla del DB e aggiorno la gridview con il nuovo valore?
oppure come faccio a fare una query stupidissima del tipo:
INSERT into TABELLA campo VALUES valore; (nn ricordo perfettamente la sintassi, nn vi arrabbiate se è sbagliata :D)
??
Vi ringrazio per le risposte. sono online se vi serve sapere altro
Se usi C# da poco, il mio consiglio è di cominciare a scrivere codice, anzichè affidarti alle procedure preconfezionate. Molto utili e veloci da usare, ma anche meno flessibili da modificare e poi se insorgono errori, forse anche più rognose da sistemare.
Si possono eseguire Select / Insert / Update e Delete con poche righe di codice ( unico componente richiesto è il DataGridView sulla Form ).
Ti faccio qualche esempio che uso spesso ( Access 2003, per 2007 cambia l'estensione... ) :
1. Eseguo una Select ( pulsante cmd_select ) e popolo il DataGridView1 :
private string nomeDB = "nomeDB.mdb";
private string percorsoDB = Application.StartupPath + "\\";
private string strCN;
private string nomeTabella = "nomeTabella";
private OleDbConnection CN = null;
private OleDbDataAdapter DA = null;
private DataSet DS = new DataSet();
private void cmd_select_Click(object sender, EventArgs e)
{
// Select per popolare DataGridView :
DS.Clear();
strCN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + percorsoDB + nomeDB + ";Persist Security Info=False";
CN = new OleDbConnection(strCN);
string strSql = "SELECT * FROM " + nomeTabella;
CN.Open();
OleDbCommand OCMD = new OleDbCommand();
OCMD.Connection = CN;
OCMD.CommandText = strSql;
DA = new OleDbDataAdapter(OCMD);
DA.Fill(DS, nomeTabella);
dataGridView1.DataSource = DS;
dataGridView1.DataMember = nomeTabella;
CN.Close();
}
2. Eseguo una Insert :
private void cmd_insert_Click(object sender, EventArgs e)
{
// Insert :
strCN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + percorsoDB + nomeDB + ";Persist Security Info=False";
CN = new OleDbConnection(strCN);
string strSql = "INSERT INTO " + nomeTabella + " (id, fornitore) VALUES (" + 10 + ", " + "'" + "nuovoFornitore" + "'" + ")";
CN.Open();
OleDbCommand OCMD = new OleDbCommand();
OCMD.Connection = CN;
OCMD.CommandText = strSql;
OCMD.ExecuteNonQuery();
CN.Close();
}
Per visualizzare l'ultimo aggiornamento sulla GridView basta richiamare il codice sotto il cmd_select... ;)
Forse un po' prolisso, ma sicuramente meglio per iniziare ad usare gli oggetti ADO.Net e vedere come collegarli... ;)
alucard82
27-01-2009, 00:15
Se usi C# da poco, il mio consiglio è di cominciare a scrivere codice, anzichè affidarti alle procedure preconfezionate. Molto utili e veloci da usare, ma anche meno flessibili da modificare e poi se insorgono errori, forse anche più rognose da sistemare.
Si possono eseguire Select / Insert / Update e Delete con poche righe di codice ( unico componente richiesto è il DataGridView sulla Form ).
Ti faccio qualche esempio che uso spesso ( Access 2003, per 2007 cambia l'estensione... ) :
1. Eseguo una Select ( pulsante cmd_select ) e popolo il DataGridView1 :
private string nomeDB = "nomeDB.mdb";
private string percorsoDB = Application.StartupPath + "\\";
private string strCN;
private string nomeTabella = "nomeTabella";
private OleDbConnection CN = null;
private OleDbDataAdapter DA = null;
private DataSet DS = new DataSet();
private void cmd_select_Click(object sender, EventArgs e)
{
// Select per popolare DataGridView :
DS.Clear();
strCN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + percorsoDB + nomeDB + ";Persist Security Info=False";
CN = new OleDbConnection(strCN);
string strSql = "SELECT * FROM " + nomeTabella;
CN.Open();
OleDbCommand OCMD = new OleDbCommand();
OCMD.Connection = CN;
OCMD.CommandText = strSql;
DA = new OleDbDataAdapter(OCMD);
DA.Fill(DS, nomeTabella);
dataGridView1.DataSource = DS;
dataGridView1.DataMember = nomeTabella;
CN.Close();
}
2. Eseguo una Insert :
private void cmd_insert_Click(object sender, EventArgs e)
{
// Insert :
strCN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + percorsoDB + nomeDB + ";Persist Security Info=False";
CN = new OleDbConnection(strCN);
string strSql = "INSERT INTO " + nomeTabella + " (id, fornitore) VALUES (" + 10 + ", " + "'" + "nuovoFornitore" + "'" + ")";
CN.Open();
OleDbCommand OCMD = new OleDbCommand();
OCMD.Connection = CN;
OCMD.CommandText = strSql;
OCMD.ExecuteNonQuery();
CN.Close();
}
Per visualizzare l'ultimo aggiornamento sulla GridView basta richiamare il codice sotto il cmd_select... ;)
Forse un po' prolisso, ma sicuramente meglio per iniziare ad usare gli oggetti ADO.Net e vedere come collegarli... ;)
Ciao. Innanzi tutto ti ringrazio per la risposta.
Ho avuto 2 problemi in quello che hai scritto:
1) non mi mi trovava Oledbconnection e la soluzione era mettere una using all'inizio del codice ovvero:
using System.Data.OleDb;
(sò che lo sai, ma lo scrivo nel caso dovesse servire a qualcun altro)
2) L'altra cosa che non mi funzionava è stata la connessione al database Access 2007. Ho cercato un pò in giro e se dovesse essere d'aiuto a qualcun altro ho trovato la stringa di connessione giusta:
strCN = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + percorsoDB + nomeDB + "; Persist Security Info=False";
Detto questo per ora sembra funzionare. Nel caso dovessi avere altri problemi proverò di nuovo a postare.
Ti ringrazio ancora
Ciao
strCN = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + percorsoDB + nomeDB + "; Persist Security Info=False";
Detto questo per ora sembra funzionare. Nel caso dovessi avere altri problemi proverò di nuovo a postare.
Ti ringrazio ancora
Ciao
Già infatti avevo specificato che il mio esempio era su Access 2003.
Cmq, per le stringhe di connessione, se già non lo hai trovato per conto tuo, suggerisco di dare un'occhiata qui :
http://www.connectionstrings.com/
Il nome dice tutto... ;)
alucard82
27-01-2009, 11:08
Già infatti avevo specificato che il mio esempio era su Access 2003.
Cmq, per le stringhe di connessione, se già non lo hai trovato per conto tuo, suggerisco di dare un'occhiata qui :
http://www.connectionstrings.com/
Il nome dice tutto... ;)
sisi è il sito da dove l'ho recuperata ;) grazie ancora.
senti una domanda stupida, c'è un modo x refreshare subito la tabella una volta fatta una insert sul database? così riesco a vedere quello che ho appena inserito. grazie :)
senti una domanda stupida, c'è un modo x refreshare subito la tabella una volta fatta una insert sul database? così riesco a vedere quello che ho appena inserito. grazie :)
Basta che esegui lo stesso codice della prima Select, che serve allo scopo di popolare il DataGridView. Comunque ciò dipende dal numero di oggetti Private a livello di Form, che hai già inizializzato.
Nel mio caso basta :
DS.Clear();
string strSql = "SELECT * FROM " + nomeTabella;
CN.Open();
OleDbCommand OCMD = new OleDbCommand();
OCMD.Connection = CN;
OCMD.CommandText = strSql;
DA = new OleDbDataAdapter(OCMD);
DA.Fill(DS, nomeTabella);
dataGridView1.DataSource = DS;
dataGridView1.DataMember = nomeTabella;
CN.Close();
Almeno... io preferisco così, avere il controllo diretto, piuttosto che avere cose in giro, come connessioni che rimangono aperte... Ecc... ;)
alucard82
16-02-2009, 23:57
qualcuno mi può suggerire un buon manuale su visual c#? non mi interessa la parte sulla programmazione (if, cicli, sintassi) ma uno che mi spieghi le varie funzioni con i vari metodi e come si usano.
Vi ringrazio tutti
ciao
qualcuno mi può suggerire un buon manuale su visual c#? non mi interessa la parte sulla programmazione (if, cicli, sintassi) ma uno che mi spieghi le varie funzioni con i vari metodi e come si usano.
Vi ringrazio tutti
ciao
Beh, trovare un manuale generico che eviti di vendere un bel po' di carta sull'introduzione alla sintassi, la vedo dura...
Secondo me l'unica sono le MSDN Library ( Online o Offline ).
Cerchi il Metodo/Funzione/Proprietà che ti interessa e di solito trovi anche qualche esempio di utilizzo.
alucard82
13-03-2009, 18:52
Beh, trovare un manuale generico che eviti di vendere un bel po' di carta sull'introduzione alla sintassi, la vedo dura...
Secondo me l'unica sono le MSDN Library ( Online o Offline ).
Cerchi il Metodo/Funzione/Proprietà che ti interessa e di solito trovi anche qualche esempio di utilizzo.
Grazie per la risposta, sei stato gentilissimo. Cmq è proprio quello che sto facendo. Cerco un pò li e un pò su qualche sorgente (by google) e cerco di risolvere il mio problema.
Ti vorrei chiedere un'altra cosina, sempre se l'hai mai utilizzata, per caso sai come aggiungere voci al menù contestuale di windows (quello che si ottiene con il tasto destro del mouse, es tipo Estrai con Winrar) ? Vorrei fare una piccola applicazione che mi permetta, selezionati due file, di rinominarli cambiando solo l'estensione. Il tutto direttamente da Vista/XP (quindi senza aprire un programma a parte).
Grazie ancora per tutto
per caso sai come aggiungere voci al menù contestuale di windows (quello che si ottiene con il tasto destro del mouse, es tipo Estrai con Winrar) ? Vorrei fare una piccola applicazione che mi permetta, selezionati due file, di rinominarli cambiando solo l'estensione. Il tutto direttamente da Vista/XP (quindi senza aprire un programma a parte).
Chi non muore si rivede... :p
Beh, non sarà certo cosa semplice ( non l'ho mai fatto, e credo non lo farò mai, piuttosto creo un'interfaccia tipo-explorer nella mia applicazione e faccio fare tutto da lì... ).
Personalmente non mi piace proprio l'approccio diretto al registro di sistema.
Voglio dire, usiamo .Net, abbiamo a disposizione controlli grafici potenti e un Signor Framework ! L'unica cosa che ancora tollero è la chiamata diretta ( in lettura ) alle API, perchè in certi casi è praticamente l'unica scelta possibile...
Un esempio abbastanza compatto lo trovi qui :
http://blog.voidnish.com/?p=17
- Secondo me non puoi fare a meno di interferire col registro.
- Dovrai gestirti anche la successiva rimozione del nuovo Item, alla chiusura / disinstallazione del tuo programma...
- E poi per intercettare le azioni sui nuovi items e far eseguire le operazioni desiderate ?
- E poi chi ci dice che l'accesso al registro piacerà a XP e a Vista nello stesso modo ?
Insomma, buona fortuna... ;)
alucard82
14-03-2009, 16:00
Chi non muore si rivede... :p
Beh, non sarà certo cosa semplice ( non l'ho mai fatto, e credo non lo farò mai, piuttosto creo un'interfaccia tipo-explorer nella mia applicazione e faccio fare tutto da lì... ).
Personalmente non mi piace proprio l'approccio diretto al registro di sistema.
Voglio dire, usiamo .Net, abbiamo a disposizione controlli grafici potenti e un Signor Framework ! L'unica cosa che ancora tollero è la chiamata diretta ( in lettura ) alle API, perchè in certi casi è praticamente l'unica scelta possibile...
Un esempio abbastanza compatto lo trovi qui :
http://blog.voidnish.com/?p=17
- Secondo me non puoi fare a meno di interferire col registro.
- Dovrai gestirti anche la successiva rimozione del nuovo Item, alla chiusura / disinstallazione del tuo programma...
- E poi per intercettare le azioni sui nuovi items e far eseguire le operazioni desiderate ?
- E poi chi ci dice che l'accesso al registro piacerà a XP e a Vista nello stesso modo ?
Insomma, buona fortuna... ;)
heheheh hai perfettamente ragione. quasi quasi mi creo un programmino piccolino e con le espressioni regolari vedo di fare il tutto :)
senti mi è capitato un problema relativo ai datagridview e alla stampa.
Allora l'applicazione che stavo facendo è praticamente finita.
Sono riuscito a visualizzare la preview della datagridview, però quando clicco sulla stampantina piccola nella preview, il programma stampa direttametne e non mi permette di scegliere su quale stampante fare l'output.
non è che sapresti aiutarmi? Ecco qui uno sputo di codice:
private void btnOperazioneStampa_Click(object sender, EventArgs e)
{
// ASSOCIO IL DOCUMENTO AL PRINTPREVIEWDIALOG
printPreviewDialog1.Document = this.printDocument1;
// TITOLO FINESTRA DI STAMPA
printPreviewDialog1.Document.DocumentName = "\n\nStampa Dettaglio Operazione";
// IMPOSTO LO ZOOM
printPreviewDialog1.PrintPreviewControl.Zoom = 1.0;
// IMPOSTO LA GRANDEZZA DEL printPreviewDialog
printPreviewDialog1.Width = (Convert.ToInt16 (Screen.PrimaryScreen.Bounds.Width * 0.7));
printPreviewDialog1.Height = (Convert.ToInt16 (Screen.PrimaryScreen.Bounds.Height * 0.7));
// MOSTRO IL DIALOG
printPreviewDialog1.ShowDialog();
}
// Questo metodo l'ho fatto più piccolo, ho tolto altri piccoli settaggi, tipo il font, il pennello, il rettangolo ecc ecc.
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
// STAMPA ELEMENTI DATAGRIDVIEW
int i = dettaglioDataGridView.Rows.Count;
int x = 0;
int distanza = 40;
e.Graphics.DrawString("Descrizione", printFont, Brushes.Black, 80, ((x * distanza) + 300));
e.Graphics.DrawString("Numero Seriale", printFont, Brushes.Black, 470, ((x * distanza) + 300));
for (x = 0; x < i; x++)
{
e.Graphics.DrawString(dettaglioDataGridView.Rows[x].Cells["DESCRIZIONE"].Value.ToString(), printList, Brushes.Black, 80, ((x * distanza) + 350));
e.Graphics.DrawString(dettaglioDataGridView.Rows[x].Cells["SERIALNUMBER"].Value.ToString(), printList, Brushes.Black, 470, ((x * distanza) + 350));
}
}
Quindi in poche parole si vede il preview ma poi quando faccio print nn mi fa scegliere la stampante. Puoi aiutarmi?
Ah quasi dimenticavo...grazie per tutto l'aiuto che mi hai dato :)
Sono riuscito a visualizzare la preview della datagridview, però quando clicco sulla stampantina piccola nella preview, il programma stampa direttametne e non mi permette di scegliere su quale stampante fare l'output.
...
...
Quindi in poche parole si vede il preview ma poi quando faccio print nn mi fa scegliere la stampante. Puoi aiutarmi?
Nessuno ti vieta di aprire prima una printDialog, in cui l'utente può selezionare la stampante e relativi settings.
Poi intercetti l'Ok sulla printDialog e apri la printPreviewDialog :
// Test sul pulsante premuto dall'utente sul printDialog1
if (printDialog1.ShowDialog() == DialogResult.OK)
{
// Senza Anteprima
// printDocument1.Print();
// Con Anteprima
printPreviewDialog1.Document = printDocument1;
printPreviewDialog1.ShowDialog();
}
Tieni presente che le impostazioni di stampa sono comunque legate all'oggetto printDocument1. E' lui che fa tutto il lavoro, perciò non si corre il rischio di perdere le impostazioni passando da una dialog all'altra. ;)
Il problema vero sarà intercettare i possibili errori Win32Exception, dovuti a molteplici cause ( stampante non pronta ecc... ), a cui ti esponi con questo metodo... Ma intanto prova così.
alucard82
15-03-2009, 23:36
Nessuno ti vieta di aprire prima una printDialog, in cui l'utente può selezionare la stampante e relativi settings.
Poi intercetti l'Ok sulla printDialog e apri la printPreviewDialog :
// Test sul pulsante premuto dall'utente sul printDialog1
if (printDialog1.ShowDialog() == DialogResult.OK)
{
// Senza Anteprima
// printDocument1.Print();
// Con Anteprima
printPreviewDialog1.Document = printDocument1;
printPreviewDialog1.ShowDialog();
}
Tieni presente che le impostazioni di stampa sono comunque legate all'oggetto printDocument1. E' lui che fa tutto il lavoro, perciò non si corre il rischio di perdere le impostazioni passando da una dialog all'altra. ;)
Il problema vero sarà intercettare i possibili errori Win32Exception, dovuti a molteplici cause ( stampante non pronta ecc... ), a cui ti esponi con questo metodo... Ma intanto prova così.
Mmmm non ci avevo pensato...stanotte provo e ti faccio sapere :D
Intanto grazie ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.