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
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 restacodice: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);
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
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 aiutocodice: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);
saluti

Rispondi quotando