2013-03-29 32 views
1

這裏是我的代碼的ExecuteNonQuery()返回行的意外數量的影響C#

 // 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是假的,但在數據庫中的行插入與所有我指定

信息我手動重新查詢以查看問題是否來自query.Parameters,它將無誤再次插入到數據庫中,但insertOk仍然是false!我甚至增加了兩個不應該爲空的字段,但兩種情況下的活動都是相同的

有什麼想法?

+3

好了什麼價值'的ExecuteNonQuery()'返回? 0? 2? 100? – Arran

+0

在數據庫中生效的行數 – Civa

+0

ah返回2 –

回答

3

對於UPDATE,INSERT和DELETE語句,返回值是受命令影響的行數。

當插入或更新的表上存在觸發器時,返回值包括受插入或更新操作以及觸發器或觸發器影響的行數影響的行數。對於所有其他類型的語句,返回值爲-1。如果發生回滾,返回值也是-1。

+3

答案是? – gdoron

+3

這是來自MSDN的文字複製粘貼。 – Arran

+0

啊我在桌子上有一個觸發器,將一行插入到另一個表中,這就是爲什麼 感謝您的幫助 –

7

ExecuteNonQuery它聲稱返回The number of rows affected.。這是不正確的,因爲客戶無法知道受影響的行數。該文檔錯誤地假定引擎將報告受影響的行數,但這受到會話SET NOCOUNT狀態的影響。不要編寫假設NOCOUNT總是開啓的代碼。如果您需要知道受影響的行數,請使用OUTPUT clause。依賴於@@ROWCOUNTSET NOCOUNT狀態受許多角落情況影響,其中從一個角度或另一角度來看值不正確。

+0

我喜歡你的答案:) – Alex

+1

+1 @Remus好點。 –

1

ExecuteNonQuery方法返回System.Int32

執行一個Transact-SQL語句對連接並返回 受影響的行數。

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

由於您query.ExecuteNonQuery()回報2,實在是太明顯2 == 1回報false

您的查詢爲;

bool insertOK = (2 == 1); 

DEMO

+0

是的,我已經改變它 bool insertOK =(query.ExecuteNonQuery()> 0); –

+0

@MikeBryant太棒了!你當然可以使用它.. –

+0

@mike Bryant如果它返回大小System.INT32它總是返回2甚至它的faild。 – Civa

0

使用SqlDataAdapter這樣嘗試:

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"); 
}