PDA

View Full Version : [C#] Visualizzare dati da DB Access in DataGridView


voyager18
03-09-2007, 10:31
Sto cercando di visualizzare i dati presenti in un DB di Access in un controllo DataGridView in C#. Ho usato i controlli DataSet, BindingSource e BindingNavigator.

Il codice che ho scritto per la visualizzazione è questo:
OleDbConnection Conn = new OleDbConnection();
OleDbCommand Cmd = new OleDbCommand();
OleDbDataAdapter Adptr = new OleDbDataAdapter();

string sConn = "Provider=Microsoft.Jet.OLEDB.4.0; " +
"Data source=C:\\Users\\Matteo\\Desktop\\Stramaledetta Cartuccia.mdb";
string SQL = "SELECT * FROM Vendite";

Conn.ConnectionString = sConn;
Conn.Open();
Cmd.CommandText = SQL;
Cmd.CommandType = CommandType.Text;
Cmd.Connection = Conn;
DataTable Table = new DataTable("Vendite");
datasetStramaledettacartuccia.Tables.Add(Table);
Adptr.SelectCommand = Cmd;
Adptr.Fill(Table);
Conn.Close();
bindingSourceVendite.DataMember = "Vendite";
dataGridView1.DataMember = "Vendite";

Il compilatore non mi restituisce nessun errore però i dati non si visualizzano sulla datagrid. Qualcuno mi sa spiegare perchè?

RaouL_BennetH
03-09-2007, 10:35
a 'orecchio' credo che manchi il DataSource per la tua griglia:



tuaDataGridView.DataSource = tuoDataTable o tuoDataSet

voyager18
03-09-2007, 12:49
a 'orecchio' credo che manchi il DataSource per la tua griglia:

Si hai ragione mancava il DataSource della griglia. Un'altra cosa.

Io in un campo del database devo scrivere un numero più grande di un Int32, mi ci vuole un tipo a precisione doppia. Come faccio a cambiare da codice il tipo di dato di un campo del database?

Poi nella stringa di connessione al DB come faccio a indicare la cartella dell'applicazione? Ad esempio |AppDir|\\mioDatabase.mdb

voyager18
04-09-2007, 15:45
Io in un campo del database devo scrivere un numero più grande di un Int32, mi ci vuole un tipo a precisione doppia. Come faccio a cambiare da codice il tipo di dato di un campo del database?

Poi nella stringa di connessione al DB come faccio a indicare la cartella dell'applicazione? Ad esempio |AppDir|\\mioDatabase.mdb

Poi per aggiornare il database Access con i dati che ho immesso nella datagrid ho scirtto questo codice:

private void bindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
bindingSource.EndEdit();
string SQL = "INSERT INTO [Vendite] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
string sConn = "Provider=Microsoft.Jet.OLEDB.4.0; " +
"Data source=C:\\Users\\Matteo\\Desktop\\Stramaledetta Cartuccia.mdb";

Conn.ConnectionString = sConn;
Conn.Open();
Cmd.CommandText = SQL;
Cmd.CommandType = CommandType.Text;
Cmd.Connection = Conn;
Adatt.InsertCommand = Cmd;
Adatt.Update(dataSet, "Vendite");
Conn.Close();
}

Il compilatore mi restituisce un errore a Adatt.Update(dataSet, "Vendite"); e il messaggio di errore è questo: "Nessun valore specificato per alcuni parametri necessari."

Che parametri mancherebbero???

RaouL_BennetH
04-09-2007, 16:28
Io in un campo del database devo scrivere un numero più grande di un Int32, mi ci vuole un tipo a precisione doppia. Come faccio a cambiare da codice il tipo di dato di un campo del database?

Il modo più semplice che mi viene in mente è usare il metodo: Convert.ToDouble() ricordandoti però che il valore che devi passare al metodo è una stringa, quindi al tuo Int32 devi a sua volta passare il metodo ToString(); per esempio:



int mioNumero;

double d = Convert.ToDouble(mioNumero.ToString());




Poi nella stringa di connessione al DB come faccio a indicare la cartella dell'applicazione? Ad esempio |AppDir|\\mioDatabase.mdb




//esempio:

tuaDir = @"mioDatabase.mdb";

//perchè di default se non metti un path diverso, i file che cerchi di aprire
//o ai quali cerchi di accedere sono già di base nella cartella dell'applicazione.
//il carattere "@" ti permette di risparmiare i doppi slash




Poi per aggiornare il database Access con i dati che ho immesso nella datagrid ho scirtto questo codice:


private void bindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
bindingSource.EndEdit();
string SQL = "INSERT INTO [Vendite] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
string sConn = "Provider=Microsoft.Jet.OLEDB.4.0; " +
"Data source=C:\\Users\\Matteo\\Desktop\\Stramaledetta Cartuccia.mdb";

Conn.ConnectionString = sConn;
Conn.Open();
Cmd.CommandText = SQL;
Cmd.CommandType = CommandType.Text;
Cmd.Connection = Conn;
Adatt.InsertCommand = Cmd;
Adatt.Update(dataSet, "Vendite");
Conn.Close();
}

Il compilatore mi restituisce un errore a Adatt.Update(dataSet, "Vendite"); e il messaggio di errore è questo: "Nessun valore specificato per alcuni parametri necessari."

Che parametri mancherebbero???

Innanzitutto se usi SqlServer i parametri devi passarli con "@" e non con "?".
Questi ultimi sono relativi a MySql. L'esempio che ti faccio è con SqlServer

Si chiamano SqlParameter e devono essere definiti prima:

Devi decidere o se creare un array di parametri o di trattarli uno alla volta:


//ti consiglio l'array
SqlParameter[] parameters = new SqlParameter[3];

//definiamo prima che tipo di dato è
parameters[0] = new SqlParameter("@nome_campo_tua_tabella", SqlDbType.TipoDiDatoDelDatabase); //per esempio un Intero o una stringa..

//poi definiamo da dove deve prendere il valore
parameters[0].Value = tuaGriglia.Rows[numero_riga].Cells[numero_di_cella].Value;

//e questo per ogni parametro;

//poi questi parametri li devi aggiungere al tuo insert command, per es.:

cmd.Parameters.Add(parameters[0]);

//oppure puoi ciclarli con un for od un foreach:

for(int i = 0; i < numeroParametri; i++)
{
cmd.Parameters.Add(parameters[i]);
}



Tieni presente però che le mie sono solo indicazioni, non sono molto bravo a programmare.

Ciao.

RaouL.

voyager18
04-09-2007, 17:33
Ho seguito il tuo metodo con l'array e ha funzionato. C'è però un modo per salvare nel database Access solo i dati che sono stati modificati dopo l'ultimo salvataggio?

RaouL_BennetH
04-09-2007, 17:36
Ho seguito il tuo metodo con l'array e ha funzionato. C'è però un modo per salvare nel database Access solo i dati che sono stati modificati dopo l'ultimo salvataggio?

Beh, in questo caso devi fare una query di aggiornamento, cioè, invece di fare:



string SQL = "INSERT INTO blablabla...";

//devi fare:

string SQL = "UPDATE nomeTuaTabella SET campo1 = nuovo_valore, campo2 = nuovo_valore WHERE condizione_per_la_sostituzione... ";

voyager18
04-09-2007, 18:16
Quella che mi hai detto tu è per aggiornare dei campi già esistenti giusto? Io invece devo fare:

- Apro il database con alcuni record già esistenti
- Inserisco dei nuovi record
- Salvo il database

Come faccio a creare dei parametri per l'oggetto Command che includano però solo i nuovi record che ho inserito?

voyager18
04-09-2007, 20:17
Aiutatemi per favore!!!:help:

voyager18
05-09-2007, 09:13
Aiutatemi vi pregooo!! :cry:

RaouL_BennetH
05-09-2007, 09:14
Quella che mi hai detto tu è per aggiornare dei campi già esistenti giusto? Io invece devo fare:

- Apro il database con alcuni record già esistenti
- Inserisco dei nuovi record
- Salvo il database

Come faccio a creare dei parametri per l'oggetto Command che includano però solo i nuovi record che ho inserito?

Scusami, non riesco a capire bene; Allora, tu apri il tuo db e leggi i dati già presenti in una tabella, e li piazzi sulla griglia. Ora, se devi inserire nuovi record nella tabella, allora ti basta la INSERT, se invece devi aggiornare i dati già presenti devi fare l'UPDATE.

Forse mi sfugge qualcosa ?!?

voyager18
05-09-2007, 09:19
Hai capito bene. Però la mia domanda è questa. Come faccio ad aggiornare/inserire solo i record che ho modificato?

RaouL_BennetH
05-09-2007, 09:31
Hai capito bene. Però la mia domanda è questa. Come faccio ad aggiornare/inserire solo i record che ho modificato?

Allora, la parola chiave è proprio "aggiornare". L'unico modo che conosco per aggiornare un record già presente è l'utilizzo di una query di update. Altrimenti dovresti ricorrere all'uso di `trigger` ma in questo caso non saprei aiutarti dato che sono ignorante su questi `cosi` :)

voyager18
05-09-2007, 09:37
e per i parametri dell'oggetto OleDbCommand? cioè come faccio ad inserire nella query di aggiornamento tutti i dati modificati o aggiunti?

voyager18
05-09-2007, 10:37
Per favore aiutami che sto diventando pazzo!! :help:

RaouL_BennetH
05-09-2007, 10:47
e per i parametri dell'oggetto OleDbCommand? cioè come faccio ad inserire nella query di aggiornamento tutti i dati modificati o aggiunti?

Credo che tu debba separare le cose, intendo l'inserimento e l'aggiornamento, ma questo a livello di `motore sql`. In C# tramite i DataSet potresti gestire tutto automaticamente documentandoti sulle proprietà e sui metodi di quest'oggetto. A livello puramente di sql invece, potresti tentare di evitare sql da codice ma creare delle stored procedure. Purtroppo sono entrambi campi nei quali sono ignorante :(