39 messaggi dal 05 settembre 2008
Sicuramente il titolo non aiuta. Proverò ad essere più chiaro.
Da circa un mese, mi sto occupando di una mini applicazione web per la gestione di una biblioteca.
Il db (sql2005) è composto da alcune tabelle, ma vorrei focalizzare l'attenzione su due tabelle in particolare: T_Inventario e T_Consultazione.
La prima, oltre ad avere l'ID della tabella stessa contiene i campi Titolo, Autore, AnnoEdizione, ...., Disponibilità (questo campo è 0 se è disponibile in biblioteca, diventa 1 se il libro è in consultazione, ovvero è stato assegnato ad un soggetto per un periodo di tempo).
La seconda tabella, oltre ad avere l'ID della tabella stessa, contiene i campi Cognome, Nome, NumInventario (identifica il libro che è stato assegnato al soggetto), DataConsegna, DataRestituzione.

Adesso che ho spiegato lo scenario in cui mi trovo gradirei qualche consiglio per ottenere quanto segue:
- quando assegno un libro ad un soggetto ed aggiungo di conseguenza un record nella tabella t_consultazione, ho la necessità di valorizzare il campo Disponibilità della tabella T_Inventario a 1, in corrispondenza del libro assegnato identificato dal campo NumInventario. Questo campo dovrà tornare ad essere valorizzato a 0 quando il libro rientrerà in biblioteca e questo dato lo posso ottenere solo inserendo la data di restituzione nel campo DataRestituzione della tabella T_Consultazione.

Considerando che sono alle prime armi e quello che ho descritto sopra penso sia più grande di me, Vi prego di fornirmi consigli, suggerimenti e quant'altro.
Ho cercato di documentarmi su internet, sui vari forum, con dei libri, ma forse ho fatto peggio!!! Architettura disconnessa, connessa, DataSet, DataTable, Data Reader, ObjectDataSource, SqlDataSource .... sembrano essere tutti la stessa cosa.
Grazie a coloro che mi aiuteranno ad accrescere il livello conoscitivo della programmazione.
Marco
438 messaggi dal 08 aprile 2009
Hai più possibilità. Questo dipende dalle tue scelte progettuali:
1 soluzione: esegui delle insert e update a cascata sotto transazione possibilmente lato codice applicazione
2 soluzione: all'insert di una tabella abiliti dei trigger che andranno ad operare sulle altre tabelle.

Ad esempio quando assegni un libro devi:
1)INSERT nella tabella T_Consultazione
2)UPDATE della tabella T_Inventario con disponibilità a 1 dove id libro di consultazione è uguale a id di inventario.

Quando rientra:
1)Update della tabella T_Consultazione con data restituzione
2)UPDATE della tabella T_Inventario con disponibilità a 0 dove id libro di consultazione è uguale a id di inventario.

Quindi o utilizzi le Transazioni o metti due trigger in T_consultazione:
1 trigger: lo abiliti in insert ed effettui una update su T_Inventario
2 trigger: lo abiliti in update e se data restituzione viene valorizzata aggiorni T_Invertario
39 messaggi dal 05 settembre 2008
Ti ringrazio per l'interessamento, i tuoi consigli sono per me preziosi.
Scartando a priori i trigger (perchè non ho idea di che cosa siano, figuriamoci come si usano) ti chiedo se hai un link a cui rimandarmi per prendere spunto sulla prima delle due soluzioni da te proposte.
Questo perchè finchè si tratta di aggiungere, eliminare o modificare delle righe mediante interfaccia grafica (ex. form view) ed un SqlDataSource, tutto va a gonfie vele, il problema è quando devo scrivere righe di codice.
Aimè ero abituato con il vecchio Visual Basic 6 dove scorrere un record, leggere e scrivere dei valori in un campo era per me molto semplice ed intuitivo. Questa nuova tecnologia (sicuramente più performante) non l'ho proprio compresa.
Se ho ben capito adesso non è più possibile scorrere un record spostandosi dall'inizio alla fine (per intenderci: move first, move last, move next, ecc.).
Grazie per il supporto e per la sopportazione tua e di tutti coloro che mi potranno fornire aiuto.
Marco
438 messaggi dal 08 aprile 2009
Non cambia più di tanto. Puoi tranquillamente scorrere un recordset solo che cambia l'oggetto che utilizzi.

Cmq ti posto un pò di codice scritto in c# ma se utilizzi VB.net puoi convertirlo con un convertor gratuito su internet ad esempio http://www.developerfusion.com/tools/convert/vb-to-csharp/.

Se utilizzi come data base Sql Server puoi utilizzare la libreria SqlClient altrimenti un Oledb.

Per la prima devi mettere una using all'inizio della classe:
using System.Data.SqlClient;


Per una selezione dei dati puoi utilizzare SqlDataAdapter e mettere i dati in un DataTable che poi scorrerai con una for o con una foreach:
string StrConn = ""; //Stringa di connessione al data base. 
//Crei l'oggetto di connessione al data base con la stringa impostata prima
SqlConnection SqlConn = new SqlConnection(StrConn );
//Crei un nuovo oggetto DataAdapter
SqlDataAdapter adp = new SqlDataAdapter();
//Imposti la tua Select
string Select = "SELECT * FROM TABELLA ";
//Imposti il comando sull'oggetto DataAdapter
adp.SelectCommand = new SqlCommand(Select , SqlConn);
//Crei un nuovo Data Table
DataTable  DT = new DataTable();
//Metti i dati nel Data Table
adp.Fill(DT);


Il datatable è un oggetto molto comodo perchè riesci a vedere tutti i dati selezionati come se fosse una selezione direttamente su Sql Server. Questo lo fai quando sei in debug ti posizione sul data table e quando ti appare una lenti di ingrandimento ci clicchi. A quel punto si apre una finestra con i dati nel data table.
Per scorrere i dati:
for (int i = 0; i< DT.Rows.Count; i++)
{
   string valoreCol1 = DT.Rows[i]["NOME COLONNA 1"].ToString();
   string valoreCol2 = DT.Rows[i]["NOME COLONNA 2"].ToString();
   //e così via

}


Per inserire, aggiornare e cancellare i dati devi aprire prima il data base e poi eseguire i comandi di INSERT,UPDATE,DELETE

Apertura del data base:
string StrConn = ""; //Stringa di connessione al data base. 
SqlConnection SqlConn = new SqlConnection(StrConn);
SqlConn.Open();


Esecuzione del comando INSERT o UPDATE o DELETE
string cmdText="INSERT INTO...";
SqlCommand SqlComm = new SqlCommand(cmdText, SqlConn);
SqlComm.ExecuteNonQuery();

//Chiusura del datat base
SqlConn.Close();


Eseguendo con ExecuteNonQuery dal comando non tornano indietro valori, ma esiste anche ExecuteScalar che torna indietro per esempio l'identity.

Se devi farlo sotto transazione, cioè eseguire in cascata una serie di operazioni sul data base e devono essere effettive solo se tutte vanno a buon fine, devi creare un SqlTransaction:

//Apertura del data base
string StrConn = ""; //Stringa di connessione al data base.
SqlConnection SqlConn = new SqlConnection(StrConn);
SqlConn.Open();

//Creazione di una transazione
SqlTransaction trans = SqlConn.BeginTransaction();

//Esecuzione dei comandi con transazione
try
{
//Esecuzione comando 1
string cmdText="INSERT INTO...";
SqlCommand SqlComm = new SqlCommand(cmdText, SqlConn,trans);
SqlComm.ExecuteNonQuery();

//Esecuzione comando 2
string cmdText="UPDATE tabella SET...";
SqlCommand SqlComm = new SqlCommand(cmdText, SqlConn,trans);
SqlComm.ExecuteNonQuery();
//e così via

//Se tutte vanno a buon fine fai la commit
trans.Commit();
SqlConn.Close();

}
catch (Exception ex)
{
//Se qualcosa va in errore fai la rollback
trans.Rollback();
SqlConn.Close();
}


[/oode]

Cmq se vai nella guida di msdn trovi tutto:
http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlconnection(VS.80).aspx

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC