C# Inserimento, Modifica e Cancellazione

martedì 20 aprile 2010 - 11.45

lexen Profilo | Newbie

Salve,
qualcuno mi puo' consigliare delle rutine per fare l'inserimento,la modifica e la cancellazione dei dati su un database sqlServer.
L'applicativo è monoutente ed è sviluppato in c#
Grazie

AntCiar Profilo | Expert

Ciao.

ci sono due modi per fare ciò che ti serve:

1 - Crei il tuo dataset utilizzando un tableAdapter. In questo modo dopo aver modificato i dati nel datatable invochi la funzione Update() del Dataset e lui provvederà in automatico a fare le INSERT, UPDATE e DELETE necessarie.

2 - Crei sul tuo dataTable un dataview e effettui 3 RowStateFilter

//Inserimento delle righe aggiunte
dv.RowStateFilter = DataViewRowState.Added;
foreach (DataRowView rw in dv)
{
"INSERT INTO (........................) VALUES (" + rw["campo"] + ", " .............................);
}

//Aggiornamento delle righe modificate
dv.RowStateFilter = DataViewRowState.ModifiedCurrent;
foreach (DataRowView rw in dv)
{
"UPDATE Tabella SET ...................................................
}

//Eliminazione delle righe eliminate
dv.RowStateFilter = DataViewRowState.Deleted;
foreach (DataRowView rw in dv)
{
"DELETE FROM tabella WHERE ..........
}

Io ti consiglio di utlizzare la 1a soluzione così non ti devi mettere a scrivere codice per le istruzioni SQL visto che te le genera in automatico.

Ciao ciao




Cristian Barca

lexen Profilo | Newbie

Ciao,
in verità io ho creato precedentemente le mie stored procedure parametriche sul database (insArticolo,modArticolo,delArticolo) e vorrei adesso utilizzare i metodi della mia classe per effettuare queste operazioni sul database.
Effettivamente non se ho intrapreso la strada giusta, e quindi volevo un consiglio su come procedere e se era il caso di continuare per questa strada.

Grazie mille.

AntCiar Profilo | Expert

Ciao.

La strada delle "Stored Procedure" non è male. L'unico inconveniente è che se poi devi fare ad esempio l'update di un campo di una tabella specifica e non vuoi "imbastardire" il tuo codice, ti tocca creare una stored e poi scrivere il codice per richiamarla nella tua applicazione.

Personalmente io le stored le ho usate principalmente per le operazioni onerose. Per il resto scrivo direttamente l'SQL nell'applicazione.

Di seguito ti ho postato un pezzo di codice per richiamare una stored Procedure: (Stored creata su database MYSQL. Per gli altri penso sia uguale)

ciao ciao

---------------------------------------------------------------------------------------------------

public static void runStoredProcedureABC(string parametro1, string parametro2 ........)
{
string SpName = "xxxxxx"; //Qui al posto degli 'xxxxxx' ci va il nome della stored creata a database
try
{
MySqlConnection conn = new MySqlConnection;
conn.ConnectionString = "..............................."; //qui ci va la stringa di connessione al database
conn.Open();
MySql.Data.MySqlClient.MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = SpName;

//Al Posto degli 'xxxxxxx' devi sostituire il nome del parametro dichiarato nella Stored (il ? non lo devi togliere da nessuna delle due righe che seguono )
cmd.Parameters.Add("?xxxxxxxx", parametro1);
cmd.Parameters["?xxxxxxxx"].Direction = ParameterDirection.Input;

//Ripeti le due righe precedenti per ogni parametro da passare alla stored

cmd.ExecuteNonQuery();
conn = null;
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{
System.Console.WriteLine(ex.Message);
}
catch (Exception exc)
{
System.Console.WriteLine(exc.Message);
}
}

Cristian Barca

lexen Profilo | Newbie

C'è un piccolo problema dalla mia stored "insert" dovrei riuscire dopo l'inserimento, prelevare il campo identity dell'ultimo record inserito.

La stored è questa :

procedure [dbo].[insArticolo]

@Articolo varchar(150),
@Descrizione varchar(255),
@Categoria_id int,
@Foto varchar(255),
@Prezzo decimal(18,2),
@Articolo_id int out

As
Begin set nocount on;
Insert into Articolo (Articolo,Descrizione,Categoria_id,Foto,Prezzo)
values(@Articolo,@Descrizione,@Categoria_id,@Foto,@Prezzo)
SET @Articolo_id = SCOPE_IDENTITY()*/
end

Grazie

AntCiar Profilo | Expert

Ciao.

Personalmente non ho mai usato stored che restituiscono valori singoli tipo Id, Count etc.
Nella mia applicazione ho utilizzato stored che al termine dell'elaborazione mi restituiscono un oggetto dataTable contenente i dati richiesti.
Potresti fare anche tu la stessa cosa. Al termine dell'elaborazione nella stored ci metti una bella "SELECT MAX(campo) FROM Tabella" di modo che ti fai restituire l'ultimo ID inserito e lo processi esternamente. Ti ho postato di seguito il codice che utilizzo per fare tutto questo (è simile a quello che ti inviato ieri):

public static DataTable runStoredProcedure001(DataTable tabella, string parametro1, .... string parametroN)
{
string SpName = "xxxxxxxxx";
try
{
if (tabella == null)
{
tabella = new DataTable();
}

MySqlConnection conn = new MySqlConnection();
conn.ConnectionString = "........";
MySql.Data.MySqlClient.MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = SpName;

cmd.Parameters.Add("?xxxxxxxxxx", parametro1);
cmd.Parameters["?xxxxxxxxxx"].Direction = ParameterDirection.Input;

MySqlDataAdapter ida = new MySqlDataAdapter();
ida.SelectCommand = cmd;
ida.Fill(tabella);
conn = null;
return tabella;
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{
return null;
}
catch (Exception exc)
{
return null;
}
return tabella;
}



dove utilizzo la stored la richiamo in questo modo:

DataTable tab = new DataTable();
tab = runStoredProcedure001(tab, "...", "....");
if (tab != null)
{
.......
}

Ciao
Cristian Barca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5