ExecuteNonQuery()返回受C#影响的意外行数

本文关键字:意外 影响 返回 ExecuteNonQuery | 更新日期: 2023-09-27 18:06:23

这是我的代码

      // 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为false,但在数据库中,该行插入了我指定的的所有信息

我手动重新构建了查询,以查看问题是否来自查询。参数,它再次无错误地插入数据库,但insertOk仍然为false!我甚至添加了另外两个不应该为空的字段,但在两种情况下活动都是相同的

有什么想法吗?

ExecuteNonQuery()返回受C#影响的意外行数

ExecuteNonQuery它声称返回The number of rows affected.。这是不正确的,因为客户端无法知道受影响的行数。文档错误地假设引擎将报告受影响的行数,但这取决于会话SET NOCOUNT状态。不要编写假定NOCOUNT始终打开的代码。如果需要知道受影响的行数,请使用OUTPUT子句。依赖于@@ROWCOUNTSET NOCOUNT状态会遇到许多情况,其中从一个或另一个角度来看,值是不正确的。

对于UPDATE、INSERT和DELETE语句,返回值是受命令影响的行数。

当正在插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数来。对于所有其他类型的语句,返回值为-1。如果发生回滚,返回值也是-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

尝试使用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");
}

UPDATE查询也有同样的问题。在我的情况下,我不得不加上";设置无计数";到SQL。示例代码:

string sql =
$@"set nocount off;update PRODUCT_PLAN 
                                set WORKING_STATUS = 'P', 
                                user_id = @USER_ID
                   where workorder_base_id = @BASE_ID 
  ";
SqlCommand cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandType =CommandType.Text;
cmd.Parameters.AddWithValue("@USER_ID", opl.USER_ID);
cmd.Parameters.AddWithValue("@BASE_ID", opl.WORKORDER_BASE_ID);
cmd.CommandText = sql;
// Nr of rows updated in retval
int retval = cmd.ExecuteNonQuery();