【问题标题】:How do I check the number of affected rows on ExecuteNonQuery如何检查 ExecuteNonQuery 上受影响的行数
【发布时间】:2014-12-09 11:04:01
【问题描述】:

我目前正在处理一个 C# 项目,并且正在运行插入查询

while (reader.Read())
{
    SqlCommand GDR_EnumVoiePublique = new SqlCommand("INSERT INTO GDR_EnumVoiePublique(VP_Id,VP_Nom,OVP_Id,LVP_Id,GVP_Id,Mun_Id,VP_Description)VALUES(@VP_Id,@VP_Nom,@OVP_Id,@LVP_Id,@GVP_Id,@Mun_Id,@VP_Description)", connection);

    GDR_EnumVoiePublique.Parameters.AddWithValue("@VP_Id", Guid.NewGuid());
    GDR_EnumVoiePublique.Parameters.AddWithValue("@VP_Nom", VP_Nom);
    GDR_EnumVoiePublique.Parameters.AddWithValue("@OVP_Id", OVP_Id == null ? (object)DBNull.Value : OVP_Id);
    GDR_EnumVoiePublique.Parameters.AddWithValue("@LVP_Id", LVP_Id == null ? (object)DBNull.Value : LVP_Id);
    GDR_EnumVoiePublique.Parameters.AddWithValue("@GVP_Id", GVP_Id == null ? (object)DBNull.Value : GVP_Id);
    GDR_EnumVoiePublique.Parameters.AddWithValue("@Mun_Id", Mun_Id);
    GDR_EnumVoiePublique.Parameters.AddWithValue("@VP_Description", VP_Description);
    GDR_EnumVoiePublique.ExecuteNonQuery();
    //count = (Int32)GDR_EnumVoiePublique.Executescalar();
   //countResult = GDR_EnumVoiePublique.ExecuteScalar();
}

有没有办法可以查看在此查询期间插入了多少行?

【问题讨论】:

  • while 声明中使用柜台?
  • 答案在标题中

标签: c# sql executenonquery


【解决方案1】:

,你可以使用一个简单的计数器。

int counter = 0;
while(reader.Read())
{
   ...
   ...
   if(GDR_EnumVoiePublique.ExecuteNonQuery() > 0)
   {
      counter++;
   }
}

对于INSERT 语句,ExecuteNonQuery method 返回插入的行数。这意味着; GDR_EnumVoiePublique.ExecuteNonQuery() > 0 行执行您的 INSERT 查询,如果成功,则返回 1,如果不成功,则返回 0

【讨论】:

  • 它给出异常违反主键约束“PK_GDR_ENUMVOIEPUBLIQUE”。无法在对象“dbo.GDR_EnumVoiePublique”中插入重复键。声明已终止。
  • 这不是Soner给出的答案的问题,问题是你的数据造成的。调试它并检查你的值。
  • @JHDesigne 很明显,您尝试插入具有 same 主键值的行,这是不可能的。调试您的代码并在监视调试器中检查您的值。我相信你会为你的主键列找到一些相同的值。,
  • 但是 PK 是 VP_Id 并且我总是插入 Guid.NewGuid() 并且在我添加计数器之前它对我有用
【解决方案2】:

ExecuteNonQuery()返回SET NOCOUNT OFF时插入的行数。

Int affectedRows;

while (reader.Read())
{
    SqlCommand GDR_EnumVoiePublique = new SqlCommand("INSERT INTO GDR_EnumVoiePublique(VP_Id,VP_Nom,OVP_Id,LVP_Id,GVP_Id,Mun_Id,VP_Description)VALUES(@VP_Id,@VP_Nom,@OVP_Id,@LVP_Id,@GVP_Id,@Mun_Id,@VP_Description)", connection);

    GDR_EnumVoiePublique.Parameters.AddWithValue("@VP_Id", Guid.NewGuid());
    GDR_EnumVoiePublique.Parameters.AddWithValue("@VP_Nom", VP_Nom);
    GDR_EnumVoiePublique.Parameters.AddWithValue("@OVP_Id", OVP_Id == null ? (object)DBNull.Value : OVP_Id);
    GDR_EnumVoiePublique.Parameters.AddWithValue("@LVP_Id", LVP_Id == null ? (object)DBNull.Value : LVP_Id);
    GDR_EnumVoiePublique.Parameters.AddWithValue("@GVP_Id", GVP_Id == null ? (object)DBNull.Value : GVP_Id);
    GDR_EnumVoiePublique.Parameters.AddWithValue("@Mun_Id", Mun_Id);
    GDR_EnumVoiePublique.Parameters.AddWithValue("@VP_Description", VP_Description);

    affectedRows += GDR_EnumVoiePublique.ExecuteNonQuery();
}

【讨论】:

  • 我已经尝试过类似的事情,但它给了我一个异常违反主键约束“PK_GDR_ENUMVOIEPUBLIQUE”。无法在对象“dbo.GDR_EnumVoiePublique”中插入重复键。声明已终止。
  • @JHDesigne:我认为您在具有 PRIMARY KEY 约束的表 'dbo.GDR_EnumVoiePublique' 中插入了重复值。所以在表中插入唯一值以避免错误。
  • 我删除了表格的所有内容,所以我不这么认为
  • 您在 while 循环中将值插入到表中,因此可能会插入重复值。通过调试检查。
  • 但是 PK 是 VP_Id 我总是插入 Guid.NewGuid()
猜你喜欢
  • 2012-04-20
  • 2019-04-24
  • 2013-05-30
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
相关资源
最近更新 更多