コード例 #1
0
        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();
            }
        }
コード例 #2
0
 /// <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);
コード例 #3
0
        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);
        }