giovedì 14 giugno 2007

Gestione DataBinding Pocket PC 2003 - Sql Server 2005 Compact Ediction

Ho giocato un pò, tanto per vedere come funzionava il DataBinding di Sql Server 2005 Compact Ediction.

Per poter sviluppare per PDA teoricamente è sufficiente il Compact framework, invece nella realtà senza Visual Studio è praticamente impossibile.

Si comincia con il creare un nuovo progetto Smart Device Application

Si aggiunge al progetto un nuovo elemento, il database (.sdf)

Il wizard a questo punto apre la finestra di selezione ma ... visto che il database è vuoto (altrimenti se scegliete elemento esistente allora proseguite) io ho terminato il wizard.

Si va nella definizione del database che è visibile sul Server Explorer e si definisce la struttura dei dati.

Terminata la definizione della struttura è possibile aggiungere un nuovo DataSet al progetto

A questo punto si trascinano le tabelle  dal Server Explorer sulla definizione del file xsd.

La ricompilazione del progetto consente di far apparire nella toolbar il DataSet tipizzato e un TableAdapter per ogni DataTable mappata.

Questi oggetti si trascinano nella form del progetto.

Successivamente si possono posizionare i controlli dalla casella degli strumenti.

Su CF non esiste DataGridView nè BindingNavigator per cui è necessario inserire un menuitem, bottone per qualsiasi azione.

Il DataGrid del Compact Framework non è editabile ma può benissimo utilizzato per visualizzare i dati e per la Navigazione.

Alcuni appunti sul codice:

All'apertura della Form ho attivato un metodo che attiva la Fill del DataSet

private void MainForm_Load(object sender, EventArgs e)
{
this.datiDataSet1.tableprova.Columns["id"].AutoIncrementSeed = 1;
CaricaDati();
if (this.datiDataSet1.tableprova.Rows.Count == 0)
{
System.Data.SqlServerCe.SqlCeConnection cn
= new System.Data.SqlServerCe.SqlCeConnection(this.tableprovaTableAdapter1.Connection.ConnectionString);
System.Data.SqlServerCe.SqlCeCommand cm
= new System.Data.SqlServerCe.SqlCeCommand("INSERT INTO tableprova (Descrizione, Valore) VALUES(@P1, @P2)", cn);
System.Data.SqlServerCe.SqlCeParameter prm
= new System.Data.SqlServerCe.SqlCeParameter();
prm.DbType
= System.Data.DbType.String;
prm.SourceColumn
= "Descrizione";
prm.ParameterName
= "@p1";
cm.Parameters.Add(prm);
prm
= new System.Data.SqlServerCe.SqlCeParameter();
prm.ParameterName
= "@p2";
prm.SourceColumn
= "id";
prm.DbType
= System.Data.DbType.Double;
cm.Parameters.Add(prm);
try {
cn.Open();
for (int x = 1; x < 11; x++) {
cm.Parameters[
"@p1"].Value = "Descrizione " + x.ToString();
cm.Parameters[
"@p2"].Value = x * 1000 + x / 100;
cm.ExecuteNonQuery();
}
}
catch (Exception ex) {
}

finally {
if (cn.State == System.Data.ConnectionState.Open)
{
cn.Close();
}
}
CaricaDati();
}
}

Essendo troppo pigro per inserire dati manuali ho attivato un nuovo Command per inserire 10 righe in caso il DataSet fosse vuoto (okkio di non fare la stessa cosa in produzione!).


La verità era invece che volevo mostrare la gestione e l'inserimento dei parametri (pardon SqlCeParameter) che è del tutto uguale alla gestione di SqlParameter.


E' sempre meglio utilizzare questa forma di gestione dei Command, utilizzare i parametri vuol dire risparmiare quando si va in produzione, se lo si fa anche sugli esempi si assume un atteggiamento mentale "giusto" verso una corretta gestione dei parametri.


L'inserimento di nuove righe si attiva semplicemente aggiungendo una nuova riga vuota al BindingSource:


this.bindingSource1.AddNew();

La cancellazione di una riga:


if ((bindingSource1.Current != null))
{
this.bindingSource1.RemoveCurrent();
}
else
{
MessageBox.Show(
"Cancellazione impossibile");
}

Ovviamente per cancellare è necessario verificare prima che ci sia una riga da cancellare!

L'invio degli aggiornamenti:

 


this.bindingSource1.EndEdit();
this.tableprovaTableAdapter1.Update(this.datiDataSet1.tableprova);


Riferimenti


Esempio C#
Esempio VB.NET

Nessun commento: