Спасибо всем за ответ, и я нашел простое решение для моего вопроса, работая с DataTables
. Моя основная задача состояла в том, чтобы прочитать строки данных из листа файла Excel и проверить данные каждой строки перед добавлением их в мою таблицу базы данных (используя OracleBulkCopy) и уведомить пользователя о любых недопустимых полях данных в листе файла Excel.
Когда я импортировал данные в DataTable
из файла Excel, используя oda.Fill(dt);
, я понял, что некоторые поля DataRow
пустые (нулевые) в процессе добавления данных в DataTable
.
Как я упоминал выше в основном вопросе, мы можем присвоить DataType
для DataColumn
в DataTable
следующим образом:
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 ---------------------- колонка3
ABCD ---------------------- 20000 ----------------------- --20-Dec-2018
EFGH ----------------------- 56500,5 ---------------------- xyz17-Mar-2018
ijklm ----------------------- 67000 ---------------------- --1-Jan-2018
В приведенной выше таблице 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;
}