ExecuteNonQuery () Restituisce il numero imprevisto di righe interessate C #

Ecco il mio codice

// SqlCommand query = new SqlCommand("INSERT INTO devis (idProposition, identreprise, tauxHoraire, fraisGenerauxMO, fraisGenerauxPiece, beneficeEtAleas, idStatut, prixUnitaireVenteMO ) VALUES(@idproposition, @identreprise, @tauxHoraire, @fraisGenerauxMO, @fraisGenerauxPiece, @beneficeEtAleas, 1, @prixUnitaireVenteMO) ", Tools.GetConnection()); SqlCommand query = new SqlCommand("INSERT INTO devis (idProposition, identreprise, tauxHoraire, fraisGenerauxMO, fraisGenerauxPiece, beneficeEtAleas, idStatut, prixUnitaireVenteMO, alerteEntrepriseEnvoyee,fraisDeplacement ) VALUES(1051, 85, 20, 2, 2, 2.2, 1, 88,0,-1) ", Tools.GetConnection()); //query.Parameters.AddWithValue("idproposition", this.ID); //query.Parameters.AddWithValue("identreprise", competitor.ID); //query.Parameters.AddWithValue("tauxHoraire", competitor.CoefTauxHoraire); //query.Parameters.AddWithValue("fraisGenerauxMO", competitor.CoefFraisGenerauxMO); //query.Parameters.AddWithValue("fraisGenerauxPiece", competitor.CoefFraisGenerauxPiece); //query.Parameters.AddWithValue("beneficeEtAleas", competitor.CoefBeneficeEtAleas); //query.Parameters.AddWithValue("prixUnitaireVenteMO", Math.Round(competitor.CoefTauxHoraire * competitor.CoefFraisGenerauxMO * competitor.CoefBeneficeEtAleas, 2)); bool insertOK = (query.ExecuteNonQuery() == 1); if (insertOK) { // DO SOMETHING } 

insertOk è falso ma nel database viene inserita la riga con tutte le informazioni che ho specificato

Ho ricostruito la query manualmente per vedere se il problema provenisse dalla query.Parameters, si inserisce senza errori di nuovo nel database ma insertOk è ancora falso! Ho anche aggiunto altri due campi che non dovrebbero essere nulli ma l’attività è la stessa in entrambi i casi

qualche idea?

Per le istruzioni UPDATE, INSERT e DELETE, il valore di ritorno è il numero di righe interessate dal comando.

Quando un trigger esiste su una tabella inserita o aggiornata, il valore di ritorno include il numero di righe interessate dall’operazione di inserimento o di aggiornamento e il numero di righe interessate dal trigger o dai trigger. Per tutti gli altri tipi di istruzioni, il valore restituito è -1. Se si verifica un rollback, anche il valore di ritorno è -1.

ExecuteNonQuery afferma di restituire The number of rows affected. . Questo non è corretto, in quanto non è ansible per il client conoscere il numero di righe interessate. La documentazione presuppone erroneamente che il motore riporti il ​​numero di righe interessate, ma che sia sobject allo stato SET NOCOUNT della sessione. Non scrivere codice che presuppone che NOCOUNT sia sempre attivo. Se è necessario conoscere il numero di righe interessate, utilizzare la clausola OUTPUT . Affidarsi a @@ROWCOUNT o allo stato SET NOCOUNT è sobject a molti casi in cui il valore non è corretto da un punto di vista o da un altro.

ExecuteNonQuery metodo ExecuteNonQuery restituisce System.Int32

Esegue un’istruzione Transact-SQL sulla connessione e restituisce il numero di righe interessate.

 Return Value Type: System.Int32 The number of rows affected. 

Dal momento che la tua query.ExecuteNonQuery() restituisce 2 , è troppo ovvio 2 == 1 restituisce false .

La tua richiesta sarà;

 bool insertOK = (2 == 1); 

DEMO .

Prova a utilizzare SqlDataAdapter modo che:

 SqlDataAdapter Adabter = new SqlDataAdapter(); Adabter.InsertCommand = new SqlCommand("INSERT INTO devis values(@idProposition, @identreprise), Tools.GetConnection()); Adabter.InsertCommand.Parameters.Add("@idproposition",SqlDbType.Int).Value = yorID; Adabter.InsertCommand.Parameters.Add("@identreprise", SqlDbType.Int).Value = yorID; Tools.OpenConnection(); int result = Adabter.InsertCommand.ExecuteNonQuery(); Tools.CloseConnection(); if( result > 0 ) { MessageBox.Show("Information Added"); }else { MessageBox.Show("Error"); }