public async Task ExecuteAll(string configuration, int skip, int size, Func <List <MatrixDataRow>, Task <bool> > execute) { List <MatrixDataRow> rowList = new List <MatrixDataRow>(); CommonXlsxConfiguration commonXlsxConfiguration = JsonSerializerHelper.Deserialize <CommonXlsxConfiguration>(configuration); using (FileStream stream = new FileStream(commonXlsxConfiguration.FilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream)) { DataSet result = excelReader.AsDataSet(new ExcelDataSetConfiguration() { ConfigureDataTable = (_) => new ExcelDataTableConfiguration() { UseHeaderRow = commonXlsxConfiguration.HasTitle } }); var columnCount = excelReader.FieldCount; while (true) { for (var index = 0; index <= size - 1; index++) { if (skip + index > excelReader.RowCount - 1) { break; } var dataRow = result.Tables[0].Rows[skip + index]; var newRow = new MatrixDataRow(); for (var columnIndex = 0; columnIndex <= columnCount - 1; columnIndex++) { newRow.Columns.Add(new MatrixDataColumn() { Data = dataRow[columnIndex].ToString() }); } rowList.Add(newRow); } var executeResult = await execute(rowList); if (!executeResult) { break; } if (rowList.Count < size) { break; } skip = skip + rowList.Count; } } stream.Close(); } }
/// <summary> /// 实际执行的业务逻辑 /// /// </summary> /// <param name="context"></param> /// <param name="handlerConfiguration"></param> /// <param name="row"></param> /// <returns></returns> public abstract Task <bool> RealExecute(MatrixDataHandlerContext context, string handlerConfiguration, MatrixDataRow row);
public async Task <bool> Execute(MatrixDataHandlerContext context, string handlerConfiguration, MatrixDataRow row) { var strConn = await GetConnectionString(); var tableName = await GetDataTableName(); var guidColumn = await GetGuidColumnName(); var statusColumn = await GetStatusColumnName(); var errorColumn = await GetErrorColumnName(); var insertColumnNameScript = await GetInsertColumnNameScript(); var insertColumnValueScript = await GetInsertColumnValueScript(); Guid id = Guid.NewGuid(); //处理前先新增一条状态为0(待处理)的记录 await dbExecute(strConn, async (conn) => { await insertRecord(conn, tableName, id, guidColumn, statusColumn, 0, insertColumnNameScript, insertColumnValueScript, string.Empty); }); //执行处理 bool result; try { result = await RealExecute(context, handlerConfiguration, row); } catch (Exception ex) { //处理后,如果发生错误,修改之前新增的记录的状态为2(处理失败) await dbExecute(strConn, async (conn) => { await updateRecordStatus(conn, tableName, guidColumn, id, statusColumn, 2, errorColumn, ex.ToString()); }); throw; } //处理后,如果未发生错误,修改之前新增的记录的状态为1(处理成功) await dbExecute(strConn, async (conn) => { await updateRecordStatus(conn, tableName, guidColumn, id, statusColumn, 1, errorColumn, string.Empty); }); return(result); }