如何在C#中使用oledb只上载非空行的Excel电子表格?

我正在使用oledb连接导入excel表格到DataTable,如下所示。

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之前删除了几行内容的时候就出现了问题。 它会读取那些空行以及非空行,并且由于违反业务规则(必填字段缺失)而将数据保存在数据库中失败。 我试着把查询中的条件放在哪里:

 "SELECT * FROM WHERE not [CandidateId*] = 0 or not [Firstname*] = '' or not [Lastname] = '' or not [type*] = '' or not [DOB*] =" + DBNull.Value 

所以它只会select那些有数据的行。 但我无法比较非string字段,即date,整数等,这是空的时候作为DBNull来。 任何人都可以请build议的方式来做到这一点,我不想使用DataReader。

使用

 ".. WHERE NOT ([Lastname] = '' OR [DOB*] IS NULL OR ... ) 

展开vc的答案,这将删除所有行的每个列包含任何内容或空白:

 dataTable = dataTable.Rows.Cast<DataRow>().Where(row => !row.ItemArray.All(field => field is System.DBNull || string.Compare((field as string).Trim(), string.Empty) == 0)).CopyToDataTable(); 

如何在查询执行后使用Linq对象来过滤行:

 var filteredRows = uploadDataTable.Rows.Cast<DataRow>().Where( row => row.ItemArray.Any(field => !(field is System.DBNull))); 

扩大以前的答案,这对我有效。 删除所有字段为空的行。

 Dim deleteRows = From row In result.AsEnumerable Where row.ItemArray.All(Function(field) Equals(field, DBNull.Value)) For Each deleteRow In deleteRows deleteRow.Delete() Next