在导入数据库之前验证 Excel 文件数据
Validation of Excel file data before importing to Database
我正在尝试将数据从 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 文件有如下两列数据,
第1列------第2列
abc----------------230
def----------------230tr
正如您在上面看到的,第二行第二列的值为“230tr”,DataTable
不应接受抛出数据字段和行号无效的异常。
普拉维娜。
在您读取要插入的 excel 值的代码中,您应该使用 C# 函数:[Int32.TryParse][1]
或 float.TryParse
;
这将告诉您字符串是否会转换为浮点数(或整数),在这种情况下不要插入它。
可以看到详细的example/answer here:
你可以这样试试
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();
}
感谢大家的回复,我在使用 DataTables
时找到了一个简单的解决方案来解决我的问题。我的主要任务是从 Excel 文件 sheet 中读取数据行并在将其添加到我的数据库 table 之前验证每一行数据(使用 OracleBulkCopy)并通知用户任何无效的数据字段在 Excel 文件中 sheet.
当我使用 oda.Fill(dt);
从 Excel 文件 sheet 将数据导入 DataTable
时,我意识到某些 DataRow
字段是空的(null) 在向 DataTable
添加数据的过程中。
正如我在上面的主要问题中提到的,我们可以将 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 文件 sheet 如下所示,
第1列----------------第2列--------------------第3列
abcd--------------------20000-------------------- ----2018 年 12 月 20 日
efgh------------------------56500.5-------------------- --xyz17-Mar-2018
ijklm---------------------67000-------------------- ----2018 年 1 月 1 日
上面table第3行第3列RowData
的日期类型无效(xyz17-Mar-2018)。在执行 oda.Fill(dt) 时;对于上面的 table,此数据字段作为空值 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;
}
我正在尝试将数据从 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 文件有如下两列数据,
第1列------第2列
abc----------------230
def----------------230tr
正如您在上面看到的,第二行第二列的值为“230tr”,DataTable
不应接受抛出数据字段和行号无效的异常。
普拉维娜。
在您读取要插入的 excel 值的代码中,您应该使用 C# 函数:[Int32.TryParse][1]
或 float.TryParse
;
这将告诉您字符串是否会转换为浮点数(或整数),在这种情况下不要插入它。
可以看到详细的example/answer here:
你可以这样试试
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();
}
感谢大家的回复,我在使用 DataTables
时找到了一个简单的解决方案来解决我的问题。我的主要任务是从 Excel 文件 sheet 中读取数据行并在将其添加到我的数据库 table 之前验证每一行数据(使用 OracleBulkCopy)并通知用户任何无效的数据字段在 Excel 文件中 sheet.
当我使用 oda.Fill(dt);
从 Excel 文件 sheet 将数据导入 DataTable
时,我意识到某些 DataRow
字段是空的(null) 在向 DataTable
添加数据的过程中。
正如我在上面的主要问题中提到的,我们可以将 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 文件 sheet 如下所示,
第1列----------------第2列--------------------第3列
abcd--------------------20000-------------------- ----2018 年 12 月 20 日
efgh------------------------56500.5-------------------- --xyz17-Mar-2018
ijklm---------------------67000-------------------- ----2018 年 1 月 1 日
上面table第3行第3列RowData
的日期类型无效(xyz17-Mar-2018)。在执行 oda.Fill(dt) 时;对于上面的 table,此数据字段作为空值 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;
}