2013-03-29 31 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"); 
}