Ricerca 
it-ITen-US
Registrazione
Accedi
In-Vesti Dotnetwork
IN-VESTI DNW!!!
Sono finalmente arrivate le nuovissime T-Shirt di DotNetWork!!! Con soli 15,00 € ci sosterrai nelle spese di gestione della Community e ti invieremo a casa una splendida maglietta.
Se vuoi contribuire al mantenimento di DotNetWork.it Vai sulla pagina Iscrizioni
Effettua il pagamento usando IWBank
Click per andare alla pagina di Iscrizione
Oppure un Bonifico bancario (le coordinate sono sulla pagina Iscrizioni), inviaci una mail a support@dotnetwork.it indicandoci la tua taglia e l'indirizzo di spedizione.  Non appena verificata la ricezione del pagamento provvederemo a spedirti la tua T-Shirt.  Le magliette sono disponibili nelle taglie S-M-L-XL-XXL (in caso di esaurimento di una delle taglie, indica quella di "Backup"). Grazie per IN-VESTIRTI con NOI!!!
.:DotNetWork Founders:.
    Stampa     


DotNetWork Forums
[VS2005-VB] Detailsview e ItemUpdating
Ultimo Post 23 ott 2009 16.39 by Alberto [MVP] (DNW TEAM). 8 Risposte.
Stampa immediata
Ordina:
PrevPrev ProssimoProssimo
Non sei autorizzato ad inviare una risposta.
Autore Messaggi

Posts:9

--
21 ott 2009 15.06  
Ho un'applicazione in ASP.NET 2.0 (VB) e Sql Server 2005.
In una pagina c'è un Detailsview, che si alimenta da un objectdatasource.

Vorrei evitare di scrivere valori duplicati nel db.
Fino a quando scrivo un nuovo record non ho problemi, ma quando aggiorno un record non ho capito come fare...
Le possibilità:
1: scrivo i dati e gestisco l'eccezione che mi restituisce SqlServer, che nella tabella richiede campo univoco.
2: uso un controllo custom validator lato server.
3: nell'evento ItemUpdating controllo OldValues e NewValues: se sono uguali setto cancel = false, altrimenti controllo se il dato è univoco, poi scrivo nel db.
4: prima di scrivere nel db, lo interrogo alla ricerca di eventuali duplicati.

La prima soluzione non mi piace, la seconda non sono riuscito ad implementarla, dopo il controllo mi passa all'update senza valutare che la pagina non è valida (mi pare di aver capito che nei controlli lato server devo gestire IsValid nel load della pagina).
Mi piace la terza soluzione, ma qui c'è l'oggetto della richiesta, nell'evento ItemUpdating, quando controllo i valori OldValues=Nothing ...
La domanda è: come mai la collection è vuota?
L'eventuale soluzioni alternativa potrebbe essere inserire il valore da confrontare in una label nascosta nella pagina e poi usarla come confronto, oppure usare la quarta soluzione.

Grazie a chi mi da una mano...
saluti Roberto

Posts:657

--
21 ott 2009 15.15  
Prova la terza, nell'evento RowUpdating.

Guarda qui:
http://msdn.microsoft.com/en-us/lib...ating.aspx
Rudy Azzan

Posts:9

--
22 ott 2009 09.48  
Rudy, ti ringrazio della risposta,
ma io parlo di detaisview, che non ha l'evento RowUpdating ma l'evento ItemUpdating, ed ho il problema in oggetto, oldValues=Nothing, probabilmente perchè si tratta di un postback.
Mi piacerebbe sapere voi come implementate il problema dei duplicati nei Database, sia in WinForms, che nel web development.
saluti Roberto

Posts:657

--
22 ott 2009 10.06  
Strano, io ho fatto adesso un progetto di prova, ho messo il detailsview e il mio oldValues non è per niente null.. Hai fatto qualcosa di strano? Levato qualche viewstate o altro??
Rudy Azzan

Posts:11

--
22 ott 2009 13.24  
Se hai dimestichezza con l'inglese :
http://databases.aspfaq.com/database/how-do-i-prevent-duplicates-in-a-table.html

Non capisco perchè sei contrario all'uso di una chiave univoca e lasciare fare il lavoro di check sul duplicato al db, è sicuramente il modo piu performante e sicuro per evitare inserimenti di duplicati, ti basta intercettare l'exception lato codice e gestire poi lato presentation layer come mostrare all'utente il messaggio di record duplicato, oppure puoi gestire il tutto in una stored preocedure e farti restituire da lei un "codice" ad hoc da leggere lato web application, se non vuoi gestire direttamente un exception.

Posts:9

--
22 ott 2009 23.25  
Il mio Detaisviev
etailsView ID="dtl1" runat="server" AutoGenerateRows="False" DataKeyNames="IDXxxx" DataSourceID="ods1" AllowPaging="True" EnableViewState="False">

Ho letto, mi scuso ma non mi ricordo dove, che creare degli errori in SqlServer e poi gestirli non è buona programmazione.
E' vero che con la soluzione 1 faccio solo una chiamata al DB anzichè due, non volevo creare l'errore e gestirlo. Certamente la mia tabella ha il controllo sul valore e impedisce l'inserimento di duplicati.
Bene la SP del link
CREATE PROCEDURE dbo.FAQ_InsertRow
@email VARCHAR(32)
AS
BEGIN
SET NOCOUNT ON
IF EXISTS (SELECT 1 FROM blat WHERE email = @email)
RAISERROR('This value already exists.', 11, 1)
ELSE
INSERT blat(email) VALUES(@email)
END
GO
il problema si presenta anche con l'update, bisognerebbe modificare anche quella SP inserendo un Select per conoscere il vecchio valore, che è poi l'oggetto della richiesta.
Mi piaceva saper come risolvete voi il problema dei duplicati.

Per il momento ho risolto con la soluzione 3, con una label nascosta.

Saluti Roberto

Posts:11

--
23 ott 2009 12.09  
Ti posto comunque come io imposterei la cosa.

CREATE PROCEDURE INSERTVALUES
@email VARCHAR(32)
@action char(1)
@RESULT INT OUTPUT
AS
BEGIN
DECLARE   @error_number INT ,   @error_severity INT,   @error_state INT
begin try
    begin transaction
    if @action = 'N'
    begin
        INSERT blat(email) VALUES(@email)
    end
    if @action = 'U'
    begin
        (La tua query di update)
    end
    commit
    SET @RESULT = [IL TUO CODICE PER INDICARE ALLA BUSINESS LOGIC CHE HAI EFFETTUATO CORRETTAMENTE L'OPERAZIONE]
end try   
begin catch
    SELECT @error_number = ERROR_NUMBER(),    @error_severity = ERROR_SEVERITY(),    @error_state = ERROR_STATE()   
    IF @error_number = 547
    -- check constraint violation  
    BEGIN    
        SET @RESULT = [IL TUO CODICE PER INDICARE ALLA BUSINESS LOGIC CHE HAI VIOLATO LA CHIAVE PRIMARIA]
    END 
    ELSE -- Intercetti un errore non gestito e a quel punto lanci un exception.
    BEGIN 
        RAISERROR(@error_number, @error_severity, @error_state) WITH LOG  
    END
   
end catch
   

Posts:9

--
23 ott 2009 16.29  
darthfabio, ti ringrazio della risposta e della SP,
considerei chiuso l'argomento.

saluti Roberto

Posts:662

--
23 ott 2009 16.39  
considerei chiuso l'argomento.
Ciao Roberto, potresti cortesemente spuntare questo thread come risolto? Grazie,
Alberto.
Non sei autorizzato ad inviare una risposta.

Active Forums 4.1
       
Articoli
Fritto misto - Classi di uso comune (parte 2)
Helper: Una classe per la Serializzazione XML delle classi dati
2007/10/21 | Autore: Sabrina Cosolo
Icone e Toolstrip
Icone della giusta dimensione e Toolstrip modificate a runtime
2009/06/28 | Autore: Sabrina Cosolo
Miniguida alla OOP con il .NET Framework- Parte IV
Come gestire l'ereditarietà
2009/07/17 | Autore: Alberto De Luca
Panoramica delle Proprietà Subordinate (Dependency Properties)
Come iniziare a capire WPF Parte 6
2007/11/22 | Autore: Patrizia Cosolo
Introduzione a Windows Presentation Foundation (parte1)
La prima di una serie di traduzioni da articoli di MSDN o altre fonti che offrono un punto di partenza per iniziare a capire il WPF.
2007/07/29 | Autore: Patrizia Cosolo
SQL Server Nozioni base (parte 1)
Come creare un database in SQL Server Usando Sql Management Studio
2008/03/09 | Autore: Sabrina Cosolo
Panoramica degli elementi base del WPF
Come iniziare a capire com'è fatto il WPF [Windows Presentation Foundation] (parte 2)
2007/07/30 | Autore: Patrizia Cosolo
Assembly Strong Named
Firma digitale degli Assembly, uso e funzionalità
2007/08/05 | Autore: Sabrina Cosolo
    Stampa     
Home|Forums|Blogs|Mappa del sito
© 2007-2010 by DotNetWork  .:.  Condizioni d'uso  .:.  Privacy  .:.  Accedi  .:.