验证值存在于DataTable的多个列中

时间:2011-10-10 15:23:41

标签: c# linq datatable

我正在通过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));
        }
    }

1 个答案:

答案 0 :(得分:1)

如果“缺失”列的值为nullDBNull.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,如果遇到异常,则表示您已知道该专栏中的问题。

如果值为空字符串,则当然不起作用。但如果这就是你所需要的,我可以挖掘更多...