|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: May 2006
Città: Bari
Messaggi: 274
|
[Visual C#] Aiuto operazioni su DB Access 2007
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 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 ?? Vi ringrazio per le risposte. sono online se vi serve sapere altro
__________________
MY PC --> Seasonic M12-500Watt + Asus P5B Deluxe WiFi/AP + Intel Q9550 + 4 GB G.Skill 1066Mhz + 1 Hd W.D. 74 GB Raptor 10kRpm + Seagate 750GB + Asus Nvidia 9800GTX! Ultima modifica di alucard82 : 25-01-2009 alle 16:48. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
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 : Codice:
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();
}
Codice:
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();
}
Forse un po' prolisso, ma sicuramente meglio per iniziare ad usare gli oggetti ADO.Net e vedere come collegarli... |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: May 2006
Città: Bari
Messaggi: 274
|
Quote:
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: Codice:
using System.Data.OleDb; 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: Codice:
strCN = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + percorsoDB + nomeDB + "; Persist Security Info=False"; Ti ringrazio ancora Ciao
__________________
MY PC --> Seasonic M12-500Watt + Asus P5B Deluxe WiFi/AP + Intel Q9550 + 4 GB G.Skill 1066Mhz + 1 Hd W.D. 74 GB Raptor 10kRpm + Seagate 750GB + Asus Nvidia 9800GTX! |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
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... |
|
|
|
|
|
|
#5 | |
|
Member
Iscritto dal: May 2006
Città: Bari
Messaggi: 274
|
Quote:
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
__________________
MY PC --> Seasonic M12-500Watt + Asus P5B Deluxe WiFi/AP + Intel Q9550 + 4 GB G.Skill 1066Mhz + 1 Hd W.D. 74 GB Raptor 10kRpm + Seagate 750GB + Asus Nvidia 9800GTX! Ultima modifica di alucard82 : 27-01-2009 alle 12:11. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Nel mio caso basta : Codice:
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();
|
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: May 2006
Città: Bari
Messaggi: 274
|
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
__________________
MY PC --> Seasonic M12-500Watt + Asus P5B Deluxe WiFi/AP + Intel Q9550 + 4 GB G.Skill 1066Mhz + 1 Hd W.D. 74 GB Raptor 10kRpm + Seagate 750GB + Asus Nvidia 9800GTX! |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
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. |
|
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: May 2006
Città: Bari
Messaggi: 274
|
Quote:
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
__________________
MY PC --> Seasonic M12-500Watt + Asus P5B Deluxe WiFi/AP + Intel Q9550 + 4 GB G.Skill 1066Mhz + 1 Hd W.D. 74 GB Raptor 10kRpm + Seagate 750GB + Asus Nvidia 9800GTX! |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
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... |
|
|
|
|
|
|
#11 | |
|
Member
Iscritto dal: May 2006
Città: Bari
Messaggi: 274
|
Quote:
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: 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));
}
}
Ah quasi dimenticavo...grazie per tutto l'aiuto che mi hai dato
__________________
MY PC --> Seasonic M12-500Watt + Asus P5B Deluxe WiFi/AP + Intel Q9550 + 4 GB G.Skill 1066Mhz + 1 Hd W.D. 74 GB Raptor 10kRpm + Seagate 750GB + Asus Nvidia 9800GTX! Ultima modifica di alucard82 : 14-03-2009 alle 17:03. |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Poi intercetti l'Ok sulla printDialog e apri la printPreviewDialog : Codice:
// Test sul pulsante premuto dall'utente sul printDialog1
if (printDialog1.ShowDialog() == DialogResult.OK)
{
// Senza Anteprima
// printDocument1.Print();
// Con Anteprima
printPreviewDialog1.Document = printDocument1;
printPreviewDialog1.ShowDialog();
}
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ì. |
|
|
|
|
|
|
#13 | |
|
Member
Iscritto dal: May 2006
Città: Bari
Messaggi: 274
|
Quote:
Intanto grazie
__________________
MY PC --> Seasonic M12-500Watt + Asus P5B Deluxe WiFi/AP + Intel Q9550 + 4 GB G.Skill 1066Mhz + 1 Hd W.D. 74 GB Raptor 10kRpm + Seagate 750GB + Asus Nvidia 9800GTX! |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:19.




















