【问题标题】:Remove row from datatable if column is not numeric [closed]如果列不是数字,则从数据表中删除行[关闭]
【发布时间】:2021-05-23 08:40:38
【问题描述】:

我有一个包含几列的数据表。第一列是我们的员工 ID。不幸的是,并不是所有的行都是数字的,我们想要删除那些不是数字的。例如,我们有 1 行有“@#$”,我想删除这样的行。我目前有以下代码。

        var len = dt.Rows.Count;
        for(int y = 0; y < len; y++)
        {
            var mwd = dt.Columns[0].ToString();
            bool valid = int.TryParse(mwd, out int n);
            if (valid)
            {
                log.LogInformation("mwd is numeric");
            }
            else
            {
                log.LogInformation("mwd is not numeric");
                dt.Rows[y].Delete();
            }
        }

但是,这不会删除该行。我究竟做错了什么?提前致谢。

编辑:周边代码

DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        string[] columns = { "Mwd", "Naam", "Kostenplaats Externe id (Klant)", "Kostenplaats Loonlijstcode (Activiteit)", "Kostenplaats Naam (Activiteit)", "Datum", "Uren ruw", "Ber. Uren", "Verlof volledig pad" };
        foreach (string column in columns)
        {
            dt.Columns.Add(column);
        }
        using (StreamReader reader = new StreamReader(req.Body))
        {
            while (reader.EndOfStream == false)
            {
                string[] rows = reader.ReadLine().Split(',');
                DataRow dr = dt.NewRow();
                for (int i = 0; i < columns.Length; i++)
                {
                    var temp = rows[i].Trim('"');
                    dr[i] = temp.Trim('\'');
                }
                dt.Rows.Add(dr);
            }
        }

        for (int i = 0; i < dt.Rows.Count; i++)
        {
            foreach (DataColumn column in dt.Columns)
            {
                var mwd = dt.Rows[i][column].ToString();
                int n;
                bool valid = int.TryParse(mwd, out n);
                if (valid)
                {
                    log.LogInformation("mwd is numeric");
                }
                else
                {
                    log.LogInformation("mwd is not numeric");
                    dt.Rows[i].Delete();
                    i--;
                    break;
                }
            }
        }
        dt.AcceptChanges();

        log.LogInformation(dt.ToString());


        for (int x = 0; dt.Rows.Count > x; x++)
        {
            string sql = "INSERT INTO dbo.kronos (Mwd, Naam, KostenplaatsExterneIdKlant, KostenplaatsLoonlijstcodeActiviteit, KostenplaatsNaamActiviteit, Datum, UrenRuw, BerUren, VerlofVolledigPad)" +
                " VALUES ('" + dt.Rows[x]["Mwd"].ToString() + "', '" + dt.Rows[x]["Naam"].ToString() + "', '"
                + dt.Rows[x]["Kostenplaats Externe id (Klant)"].ToString() + "', '" + dt.Rows[x]["Kostenplaats Loonlijstcode (Activiteit)"].ToString() + "', '"
                + dt.Rows[x]["Kostenplaats Naam (Activiteit)"].ToString() + "', '" + dt.Rows[x]["Datum"].ToString() + "', '"
                + dt.Rows[x]["Uren ruw"].ToString() + "', '" + dt.Rows[x]["Ber. Uren"].ToString() + "', '" + dt.Rows[x]["Verlof volledig pad"].ToString() + "')";

            var str = Environment.GetEnvironmentVariable("ConnectionString");

            using (SqlConnection connection = new SqlConnection(str))
            {
                SqlCommand command = new SqlCommand(sql, connection);
                connection.Open();
                command.ExecuteNonQuery();
            }
        }

        return result;

【问题讨论】:

  • Delete 只是在数据表中将该行标记为已删除。这对数据库没有影响。该行保留在数据表中。如果要从数据表中删除标记为删除的行,则需要在循环退出时调用 AcceptChanges。从数据库中删除需要调用适配器更新方法或通过 dbCommand 进行单个调用
  • 这是有道理的,但它仍然没有删除它。它仍然给我错误:Can't convert "@#$" to int
  • 在哪一行? Int.TryParse 不应在这里给出异常

标签: c# datatable dataset row


【解决方案1】:

试试这个代码

for (int i = 0; i< dt.Rows.Count;i++)
{
   foreach (DataColumn column in dt.Columns)
   {
       var mwd = dt.Rows[i][column].ToString();
       int n;
       bool valid = int.TryParse(mwd, out n);
       if (valid)
       {
          log.LogInformation("mwd is numeric");
       }
       else
       {
         log.LogInformation("mwd is not numeric");
         dt.Rows[i].Delete();
         i--;
         break;
       }
    }
 }
dt.AcceptChanges();

如果您知道列名或其索引,请使用以下代码

for (int i = 0; i < dt.Rows.Count; i++)
{
    var mwd = dt.Rows[i]["Name"].ToString();
    //or---------------------------------
    var mwd = dt.Rows[i][index].ToString();
    int n;
    bool valid = int.TryParse(mwd, out n);
    if (valid)
    {
       log.LogInformation("mwd is numeric");
    }
    else
    {
       log.LogInformation("mwd is not numeric");
       dt.Rows[i].Delete();
       i--;
    }
}
dt.AcceptChanges();

【讨论】:

  • 这适用于第一行。在这种情况下,它的值是错误的,所以它是正确的。但是当它再次进入循环时,它会说:This row has been removed from a table and does not have any data. BeginEdit() will allow creation of new data in this row.
  • 使用中断。现在我修改了代码。再次复制并测试代码
  • 当唯一应该测试的列是索引 0 处的列时,循环列的目的是什么?
  • ok ok 对此感到抱歉,但现在我得到了错误:Collection was modified; enumeration operation might not execute
  • 对不起。我修改了代码。作品。我测试了它。我没有测试过以前的。
猜你喜欢
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 2022-11-04
  • 2022-12-14
相关资源
最近更新 更多