Я импортирую лист Excel в DataTable, используя соединение oledb, как показано ниже.
private static DataTable UploadExcelSheet(string fileName)
{
DataTable uploadDataTable;
using (OleDbConnection objXConn = new OleDbConnection())
{
objXConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName +
";Extended Properties=\"Excel 12.0;IMEX=1\"";
objXConn.Open();
OleDbCommand objCommand =
new OleDbCommand("SELECT * FROM Template$ ", objXConn);
OleDbDataAdapter objDataAdapter = new OleDbDataAdapter();
// retrieve the Select command for the Spreadsheet
objDataAdapter.SelectCommand = objCommand;
// Create a DataSet
DataSet objDataSet = new DataSet();
// Populate the DataSet with the spreadsheet worksheet data
objDataAdapter.Fill(objDataSet);
uploadDataTable = objDataSet.Tables[0];
}
return uploadDataTable;
}
Все работает нормально, но проблема возникает, когда пользователь удаляет содержимое нескольких строк перед загрузкой Excel. Он также считывает эти пустые строки вместе с непустыми, и сохранение данных в базе данных не выполняется из-за нарушения бизнес-правил (отсутствует обязательное поле). Я пробовал поставить условие where в запрос:
"SELECT * FROM WHERE not [CandidateId*] = 0 or not [Firstname*] = '' or not [Lastname] = '' or not [type*] = '' or not [DOB*] =" + DBNull.Value
Таким образом, он выберет только те строки, в которых есть данные. Но я не могу сравнивать нестроковые поля, т.е. Date, Integer и т. Д., Которые передаются как DBNull, когда они пусты. Может ли кто-нибудь предложить способ сделать это, я не хочу использовать DataReader.