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