2

这是我的代码

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

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

有任何想法吗?

4

4 回答 4

8

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

于 2013-03-29T11:18:59.403 回答
3

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

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

于 2013-03-29T11:16:56.003 回答
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.

于 2013-03-29T11:20:51.270 回答
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");
}
于 2013-03-29T11:33:45.347 回答