Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93

    comportamento strano insertcommand di sqlcommandbuilder

    ciao ragazzi pongo una domanda piuttosto difficile ma comunque ci provo.
    ho 2 scenari che all'apparenza sembrano identici ma si comportano in maniera differente e non capisco il perchè.
    ho una tabella con una identity come chiave primaria.vado ad impostare il dataadapter e imposto l'insert command prima automaticamente e poi manualmente.se lo metto a mano funziona, se invece lo faccio in automatico viene segato il commando al momento dell'update.scrivo codice per farvi capire.

    CASO A inserimento automatico tramite command builder
    codice:
    da = new SqlDataAdapter("SELECT * FROM Soggetti", Settings.Default.CrmConnectionString);
    SqlCommandBuilder bld = new SqlCommandBuilder(da);
    da.InsertCommand = bld.GetInsertCommand(true);
    da.InsertCommand.CommandText += ";SELECT [Codice] FROM [Soggetti] WHERE [Codice] = SCOPE_IDENTITY();";
    
    (eseguo codice, riempo la tabella e aggiungo una row al dataset dts...)
    
    DataTable dataChanges = dts.Tables[0].GetChanges();
    da.Update(dataChanges);
    a questo punto in da.insertcommand.commandtext trovo la mia query castrata nel senso che viene riscritta senza la parte della select per ottenere la identity.precisamente mi resta
    INSERT INTO [Soggetti] ([RagioneSociale], [Indirizzo], [Cap], [Localita], [Provincia], [Telefono], [Fax]) VALUES (@RagioneSociale, @Indirizzo, @Cap, @Localita, @Provincia, @Telefono, @Fax).ovviamente l'inserimento va a buon fine ma con il campo codice sbagliato perchè nn riceve indietro il valore della identity.

    CASO B inserimento manuale

    codice:
    da = new SqlDataAdapter("SELECT * FROM Soggetti", Settings.Default.CrmConnectionString);
    da.InsertCommand = new SqlCommand("INSERT INTO dbo.Soggetti (RagioneSociale, Indirizzo, Cap, Provincia, Localita, Telefono, Fax) " + "VALUES (@RagioneSociale, @Indirizzo, @Cap, @Provincia, @Localita, @Telefono, @Fax); " + "SELECT Codice FROM dbo.Soggetti " + "WHERE Codice = SCOPE_IDENTITY();");
    
    da.InsertCommand.Parameters.Add(new SqlParameter("@RagioneSociale", SqlDbType.NVarChar, 200,"RagioneSociale"));
    da.InsertCommand.Parameters.Add(new SqlParameter("@Indirizzo", SqlDbType.NVarChar, 200,"Indirizzo"));
    
    (ecc ecc... inserisco i parametri uno a uno manualmente)
    
    (eseguo codice, riempo la tabella e aggiungo una row al dataset dts...)
    
    DataTable dataChanges = dts.Tables[0].GetChanges();
    da.Update(dataChanges);
    a questo punto se vado ad osservare il valore dell'insertcommand ho tutta la query completa compresa la seconda select, quindi nell'inserimento della row mi ritrovo assegnato il giusto campo codice.non riesco a capire quale sia la differenza nei due listati e perchè nel primo caso la Update tagli il comando mentre nel socondo caso lo accetti senza fare una piega...spero in un aiuto
    saluti

  2. #2
    Non vorrei dire una stupidaggine ma ho l'impressione che tu abbia utilizzato in modo improprio SqlCommandBuilder.
    Questo è l'esempio su MSDN:
    codice:
    public static DataSet SelectSqlRows(string connectionString,
        string queryString, string tableName)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlDataAdapter adapter = new SqlDataAdapter();
            adapter.SelectCommand = new SqlCommand(queryString, connection);
            SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
    
            connection.Open();
    
            DataSet dataSet = new DataSet();
            adapter.Fill(dataSet, tableName);
    
            //code to modify data in DataSet here
    
            builder.GetUpdateCommand();
    
            //Without the SqlCommandBuilder this line would fail
            adapter.Update(dataSet, tableName);
    
            return dataSet;
        }
    }
    Come vedi non è necessario impostare la proprietà InsertCommand del DataAdapter in quanto è il SqlCommandBuilder che la determina a partire dalla SelectCommand. Probabilmente associando il SqlCommandBuilder le successive modifiche di InsertCommand vengono ignorate. La soluzione, nel tuo caso, è quella di non utilizzare SqlCommandBuilder, ma impostare direttamente la InsertCommand del DataAdapter, come hai fatto nel secondo esempio.
    Chi non cerca trova.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    però è strano perchè alla fine il commandbuilder non è altro che uno strumento che serve per impostare tale valori, se poi io voglio modificarli una volta impostati (come ho fatto aggiungendo quella select) dovrei essere libero di farlo.
    la cosa strana è che analizzando il valore con dei breakpoint, vedo che il commandtext rimane impostato correttamente e rimane tale per tutto il codice fino alla Update dove viene brutalmente castrato.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    x i mod: se volete chiudere questa discussione, ho ripostato nella sezione giusta.
    grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.