我正在通过asp.net C#Web应用程序导入电子表格。我需要验证excel的结果 - >在将数据传递给存储过程之前的数据表结果。如果枚举每个必需列的所有行以验证是否有值,那么是否有人有更快的解决方案?
实施Jame的建议;我最终做的是克隆原始表,该表只克隆模式。然后我将我想要的列设置为AllowDBNull = false。然后最后一步是在TryCatch语句中进行合并。如果合并失败,那么您将获得向用户抛出必需的字段验证错误。
public DataTable UploadSpreadsheetData(string tempFile)
{
try
{
__filepath = tempFile;
this.onConnectionStringChanged();
string _sheetname = GetSheetName();
DataTable _importedData = ReadTable(_sheetname);
DataTable _newTableStructure = GetClone(_importedData);
MergeDataTables(_importedData, _newTableStructure);
return _newTableStructure;
}
catch (Exception ex)
{
throw ex;
}
finally
{
this.Connection.Close();
this.Connection.Dispose();
DeleteTempFile(tempFile);
}
}
private DataTable GetClone(DataTable table)
{
DataTable _cloneTable = table.Clone();
_cloneTable.Columns["System Code"].AllowDBNull = false;
return _cloneTable;
}
private static void MergeDataTables(DataTable _importedData,
DataTable _newTableStructure)
{
try
{
_newTableStructure.Merge(_importedData, true, MissingSchemaAction.Add);
}
catch (Exception ex)
{
// Add a reference to required value structure for the
// end user to verify validity of the spreadsheet
throw new ApplicationException(String.Format("The following
error was encountered while importing the spreadsheet data. {0}.
Please check the spreadsheet to ensure all required values are
present.", ex.Message));
}
}
答案 0 :(得分:1)
如果“缺失”列的值为null
(DBNull.Value
),您可以执行以下操作:
// or whatever means you use to get your table...
DataTable dt = new DataTable();
// define your columns (whether imported or manual)
// set the columns that must have a value to deny DBNull, for example if col 3 & 4:
dt.Columns[3].AllowDBNull = false;
dt.Columns[4].AllowDBNull = false;
将这些列设置为AllowDBNull = false
后,如果之前已加载数据,则将其设置为false
时会出现异常,否则您将在Add
上获得例外如果在设置为false
之后添加数据,则为行。
因此,如果可能的话,首先设置列,但如果在导入中定义了这些列,只需在try / catch中将列设置为AllowDBNull = false
,如果遇到异常,则表示您已知道该专栏中的问题。
如果值为空字符串,则当然不起作用。但如果这就是你所需要的,我可以挖掘更多...