コード例 #1
0
ファイル: Importer.cs プロジェクト: weihongji/YuLin
        protected string ImportTable(int importId, string filePath, XEnum.ImportItemType itemType, string excelColumns, string dbColumns, string dbColumns2, object dbValues2, int sheetIndex = 1, int roundIndex = 1)
        {
            int    columnCount = dbColumns.Split(',').Length;
            string suffix      = GetTableSuffix(itemType);

            logger.DebugFormat("Importing {0} to database", suffix);
            if (String.IsNullOrWhiteSpace(filePath) || !File.Exists(filePath))
            {
                return(string.Format("File {0} cannot be found", filePath ?? "<empty>"));
            }
            logger.Debug("Getting source table");
            var sourceTable   = SourceTable.GetById(itemType);
            var sheetEntry    = sourceTable.Sheets[sheetIndex - 1];
            var dataRowEnding = sheetEntry.DataRowEndingFlag;

            logger.DebugFormat("Ending is {0}", dataRowEnding == "" ? "empty string" : dataRowEnding);

            var             oleOpened = false;
            OleDbConnection oconn     = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=Excel 8.0");

            try {
                logger.Debug("Opening connection to " + filePath);
                oconn.Open();
                oleOpened = true;
                logger.Debug("Opened");

                DataTable dt     = oconn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                string    sheet1 = dt.Rows[(sheetIndex - 1) * 2][2].ToString();
                if (!IsSheetMatched(sheet1, sheetEntry.Name))
                {
                    logger.WarnFormat("Sheet \"{0}\" is not found at index {1}. This may be caused by extra sheets added. Searching in all sheets...", sheetEntry.Name, sheetIndex);
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        sheet1 = dt.Rows[i][2].ToString();
                        if (IsSheetMatched(sheet1, sheetEntry.Name))
                        {
                            logger.WarnFormat("Got sheet \"{0}\"", sheet1.Substring(0, sheet1.Length - 1));
                            break;
                        }
                    }
                }
                if (!IsSheetMatched(sheet1, sheetEntry.Name))
                {
                    var msg = string.Format("没有找到工作表\"{0}\"", sheetEntry.Name);
                    logger.Error(msg);
                    return(msg);
                }

                logger.Debug("Importing sheet " + sheet1.Substring(0, sheet1.Length - 1));

                var sql = new StringBuilder();
                sql.AppendFormat("SELECT {0} FROM [{1}]", excelColumns, sheet1);
                sql.AppendLine(GetImportWhereSql(itemType));
                var             s      = sql.ToString();
                OleDbCommand    ocmd   = new OleDbCommand(s, oconn);
                OleDbDataReader reader = ocmd.ExecuteReader();

                int dataRowIndex = 0;
                var dao          = new SqlDbHelper();
                if (sheetIndex == 1 && roundIndex == 1)                   // Delete existing records only when importing the first sheet
                {
                    dao.ExecuteNonQuery(string.Format("DELETE FROM Import{0} WHERE ImportId = {1}", suffix, importId));
                }

                sql.Clear();
                while (reader.Read())
                {
                    if (DataUtility.GetValue(reader, 0).Equals(dataRowEnding))                       // Going to end
                    {
                        break;
                    }
                    dataRowIndex++;
                    sql.AppendLine(GetInsertSql(reader, importId, suffix, columnCount, dbColumns, dbColumns2, dbValues2));
                    // Top 1 trial for exception track
                    if (dataRowIndex == 1)
                    {
                        try {
                            dao.ExecuteNonQuery(sql.ToString());
                            sql.Clear();
                        }
                        catch (Exception ex) {
                            logger.Error("Running INSERT: " + sql.ToString(), ex);
                            throw ex;
                        }
                    }
                    // Batch inserts
                    if (dataRowIndex > 1 && dataRowIndex % 1000 == 0)
                    {
                        dao.ExecuteNonQuery(sql.ToString());
                        sql.Clear();
                    }
                }
                if (sql.Length > 0)
                {
                    try {
                        dao.ExecuteNonQuery(sql.ToString());
                        sql.Clear();
                    }
                    catch (Exception ex) {
                        logger.Error("Running INSERT: " + sql.ToString(), ex);
                        throw ex;
                    }
                }
                logger.DebugFormat("{0} records imported.", dataRowIndex);

                if (itemType == XEnum.ImportItemType.Loan)
                {
                    // Cleanup zero-records since the oledb query cannot filter them out
                    var query   = string.Format("DELETE FROM ImportLoan WHERE ImportId = {0} AND ISNULL(CapitalAmount + OweCapital + OweYingShouInterest + OweCuiShouInterest, 0) = 0", importId);
                    var cleaned = dao.ExecuteNonQuery(query);
                    logger.DebugFormat("{0} records have been cleaned because of 4-zeros.", cleaned);
                }
            }
            catch (Exception ex) {
                logger.Error("Outest catch: ", ex);
                throw ex;
            }
            finally {
                if (oleOpened)
                {
                    oconn.Close();
                }
            }
            return(string.Empty);
        }
コード例 #2
0
ファイル: Importer.cs プロジェクト: weihongji/YuLin
        private string UpdateWJFLSheet(int importId, OleDbDataReader reader)
        {
            var result = string.Empty;

            try {
                int readRows        = 0;
                int updatedRows     = 0;
                int failedRows      = 0;
                var sql             = new StringBuilder();
                var sqlSingle       = "";
                var firstColumn     = "";
                var dao             = new SqlDbHelper();
                var failedCustomers = new StringBuilder();

                while (reader.Read())
                {
                    firstColumn = DataUtility.GetValue(reader, 0);
                    if (string.IsNullOrEmpty(firstColumn) || firstColumn.Replace(" ", "").Equals("合计"))                       // Going to end
                    {
                        break;
                    }
                    readRows++;
                    sql.Clear();
                    //替换掉下面两行,解决五级分类中营业部与公司部混乱的问题
                    //sql.AppendLine("SELECT Id FROM ImportLoan");
                    //sql.AppendLine("WHERE OrgId = dbo.sfGetOrgId('{0}')");
                    sql.AppendLine("SELECT L.Id FROM ImportLoan L INNER JOIN Org O ON L.OrgId = O.Id");
                    sql.AppendLine("WHERE O.OrgNo = (SELECT OrgNo FROM Org WHERE Id = dbo.sfGetOrgId('{0}'))");
                    sql.AppendLine("	AND CustomerName = '{1}'");
                    sql.AppendLine("	AND CapitalAmount = {2}");
                    if (!string.IsNullOrEmpty(DataUtility.GetValue(reader, 3)))
                    {
                        sql.AppendLine("	AND LoanStartDate = '{3}'");
                    }
                    if (!string.IsNullOrEmpty(DataUtility.GetValue(reader, 4)))
                    {
                        sql.AppendLine("	AND LoanEndDate = '{4}'");
                    }
                    sql.AppendLine("	AND ImportId = '{5}'");
                    sqlSingle = string.Format(sql.ToString(), DataUtility.GetValue(reader, 0), DataUtility.GetValue(reader, 1), DataUtility.GetValue(reader, 2), DataUtility.GetValue(reader, 3), DataUtility.GetValue(reader, 4), importId);
                    var o = dao.ExecuteScalar(sqlSingle);
                    if (o == null)
                    {
                        failedRows++;
                        if (failedRows <= 10)
                        {
                            var msg = GetMismatchMessage(importId, DataUtility.GetValue(reader, 0), DataUtility.GetValue(reader, 1), DataUtility.GetValue(reader, 2), DataUtility.GetValue(reader, 3), DataUtility.GetValue(reader, 4));
                            failedCustomers.AppendLine(msg + "\r\n" + new string('-', 60));
                            logger.WarnFormat("No record matched for {0}-{1}-{2}-{3}-{4}", DataUtility.GetValue(reader, 0), DataUtility.GetValue(reader, 1), DataUtility.GetValue(reader, 2), DataUtility.GetValue(reader, 3), DataUtility.GetValue(reader, 4));
                        }
                        else
                        {
                            failedCustomers.AppendFormat("还有更多……\r\n", DataUtility.GetValue(reader, 1), DataUtility.GetValue(reader, 2), DataUtility.GetValue(reader, 3), DataUtility.GetValue(reader, 4));
                            logger.Warn("Stopped because of more un-matched records.");
                            break;
                        }
                    }
                    else
                    {
                        int loanId = (int)o;
                        sqlSingle = string.Format("UPDATE ImportLoan SET DangerLevel = '{0}' WHERE Id = {1} AND ISNULL(DangerLevel, '') != '{0}'", DataUtility.GetValue(reader, 5), loanId);
                        try {
                            var affected = dao.ExecuteNonQuery(sqlSingle);
                            updatedRows += affected;
                            if (affected > 0)
                            {
                                logger.DebugFormat("#{0} update to '{1}'", loanId, DataUtility.GetValue(reader, 5));
                            }
                        }
                        catch (Exception ex) {
                            logger.Error("Running: " + sql.ToString(), ex);
                            throw ex;
                        }
                    }
                }
                logger.DebugFormat("Rows read in toal: {0}", readRows);
                logger.DebugFormat("Rows updated: {0}", updatedRows);
                logger.DebugFormat("Rows not match: {0}", failedRows);
                if (failedRows == 1)
                {
                    result = Consts.MESSAGE_FORM_PREFIX + "下面客户的五级分类无法导入:\r\n" + failedCustomers.ToString() + "\r\n请确保新修改的五级分类Excel文件中,该客户的贷款余额、放款日期和到期日期格式正确。";
                }
                else if (failedRows > 1)
                {
                    result = Consts.MESSAGE_FORM_PREFIX + "下列客户的五级分类无法导入:\r\n" + (new string('-', 80)) + "\r\n" + failedCustomers.ToString() + "\r\n" + (new string('-', 80)) + "\r\n请确保新修改的五级分类Excel文件中,他们的贷款余额、放款日期和到期日期格式正确。";
                }
            }
            catch (Exception ex) {
                logger.Error("Outest catch", ex);
                return(ex.Message);
            }
            return(result);
        }