【问题标题】:Validation of Excel file data before importing to Database在导入数据库之前验证 Excel 文件数据
【发布时间】:2019-04-05 07:53:56
【问题描述】:

我正在尝试将数据从 Excel 文件读取到 DataTable。我知道在向DataTable 添加列时,我们可以为DataColumn 分配不同的DataTypes。到目前为止,我已经尝试了以下,

DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[2]
{
    new Datacolumn("column1", typeof(string)),
    new DataColumn("column2", typeof(int))
});

而我的excel文件有如下两列数据,

column1-----column2

abc----------------230

def----------------230tr

正如您在上面看到的,第二行第二列的值为“230tr”,DataTable 不应接受抛出带有无效数据字段和行号的异常。

普拉维娜。

【问题讨论】:

  • 包含数字的字符串呢?说WD40?你想在那个实例中输入什么?
  • 嗨乔恩,'WD40' 作为一个字符串会很好。但不应允许一个整体的数值并抛出异常。
  • 您可以使用正则表达式来过滤数据。添加一个函数,在该函数中传递列值并返回真/假,并基于返回仅继续或取消该列。见链接-stackoverflow.com/questions/1181419/…
  • 能否请您显示如何将上述值添加到数据表列的代码?
  • 嗨 Ajay,使用正则表达式是一种解决方案。但我发现验证可以从 DataTable 本身完成。谢谢。

标签: c# asp.net excel datatable oledb


【解决方案1】:

在您读取要插入的 excel 值的代码中,您应该使用 C# 函数:[Int32.TryParse][1]float.Try​Parse

它会告诉你字符串是否会转换为浮点数(或整数),在这种情况下不要插入它。

您可以查看详细示例/答案here

【讨论】:

  • 您好 DaniDev,感谢您的回复。在向DataTable 添加行时,我正在使用以下实现。 using (OleDBDataAdapter oda = new OleDBDataAdapter("SELECT * FROM [excel_sheet]", excel_con)) { oda.Fill(dt); } 然后我使用“OracleBulkCopy”将DataTable 中的数据一次添加到我的数据库中。因此,在向DataTable 添加数据时,我需要进行验证。我怎样才能做到这一点?
  • 将您的数据读入临时数据结构,例如字典。然后使用验证。
  • 或者只使用现有的 DataTable dt 并执行 linq select 以消除数值
【解决方案2】:

你可以这样试试。

      DataTable dt = new DataTable();
        dt.Columns.AddRange(new DataColumn[2]
        {
          new DataColumn("column1", typeof(int)),
          new DataColumn("column2", typeof(string))
        });

        dt.Clear();
        try
        {
            string input = string.Empty;
            input = Console.ReadLine();
            if (Regex.IsMatch(input, @"^[a-zA-Z]+$"))
            {
                dt.Rows.Add(1, input);
            }
            Console.WriteLine(dt.Rows[0]["column2"]);
            Console.ReadKey();
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex);
            Console.ReadKey();
        }

【讨论】:

    【解决方案3】:

    感谢大家的回复,我在与DataTables 合作时找到了一个简单的解决方案来解决我的问题。我的主要任务是从 Excel 文件表中读取数据行,并在将每行数据添加到我的数据库表之前验证每一行数据(使用 OracleBulkCopy),并通知用户 Excel 文件表中的任何无效数据字段。

    当我使用oda.Fill(dt); 将数据从Excel 文件表导入DataTable 时,我意识到在将数据添加到DataTable 的过程中,一些DataRow 字段为空(null)。

    正如我在上面的主要问题中提到的,我们可以将DataType 分配给DataTable 中的DataColumn,如下所示,

    DataTable dt = new DataTable();
    dt.Columns.AddRange(new DataColumn[3]
    {
        new Datacolumn("column1", typeof(string)),
        new DataColumn("column2", typeof(double)),
        new DataColumn("column3", typeof(DateTime))
    });
    

    我的 Excel 文件表如下,

    column1-----------------column2----------column3

    abcd----------20000---------- --2018 年 12 月 20 日

    efgh-----------56500.5---------- xyz17-Mar-2018

    ijklm-----------67000---------- --2018 年 1 月 1 日

    在上表第 3 行第 3 列 RowData 的日期类型无效(xyz17-Mar-2018)。在执行 oda.Fill(dt);对于上表,此数据字段作为空 RowData 添加到 DataTable。如果导入的数据字段不是定义的DataColumn类型的类型,其他列也一样。所以我的最后一步是检查DataTable 的每一行数据,它有一个空字段,并向用户抛出一条错误消息,其中提到了行号和列名。

    int errorRowNumber = 0;
    
    private bool validateDataTableData(DataTable dt, string dtColumnName)
    {
        Boolean isTrue = false;
    
        foreach (DataRow r in dt.Rows)
        {
              if(!string.IsNullOrEmpty(r[dtColumnName].ToString()))
              {
                    isTrue = false;
                    errorRowNumber = dt.Rows.IndexOf(r) + 2;
                    break;
              }
        }
        return isTrue;
    }
    

    【讨论】:

    • 1.我没有看到并抛出异常或错误消息? 2.您如何根据原始帖子删除数值? 3.你的'isTrue'总是假的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多