public int Parse(string absolutePath, FileParseWriterSQL fileParseWriter) { try { using (c227_FileProcessorEntities context1 = new c227_FileProcessorEntities()) { context1.Set <ft_transaction>().AsNoTracking(); var transactions = context1.ft_transaction.AsNoTracking().ToList(); ft_transaction transaction = transactions.SingleOrDefault(x => x.TransactionId == 123); if (transaction != null) { writeTable(absolutePath, fileParseWriter, transaction); } else { } } } catch (Exception ex) { } return(this.Id); }
private bool WriteMltRecordType(string absolutePath, string distribution, ft_transaction transaction) { bool result = false; string tableName = transaction.Description; List <frd_record_definition> columns = new List <frd_record_definition>(); List <ftd_transaction_definition> transactionDefinitions = transaction.ftd_transaction_definition.OrderBy(t => t.Sequence).ToList(); foreach (ftd_transaction_definition transactionDefinition in transactionDefinitions) { List <frd_record_definition> recordDefinitions = transactionDefinition.fr_record.frd_record_definition.OrderBy(r => r.Sequence).ToList(); recordDefinitions.ForEach(r => columns.Add(r)); } //version and/or create target table if required //validateTargetTable(tableName, false, DateTime.Now, columns); List <Dictionary <string, object> > rows = new List <Dictionary <string, object> >(); Dictionary <string, object> row = new Dictionary <string, object>(); //start SQL Transaction SqlConnection connection = dataAccess.GetConnection(); connection.Open(); SqlTransaction tran = connection.BeginTransaction(); //blank or non-numeric distribution implies '01' if (distribution == string.Empty | !int.TryParse(distribution, out int d)) { distribution = "01"; } //distribution is defined as char(2) distribution = distribution.PadRight(2, ' '); //get all identifiers for this transaction List <string> identifiers = new List <string>(); foreach (ftd_transaction_definition transactionDefinition in transactionDefinitions) { identifiers.Add(transactionDefinition.fr_record.Identifier); } List <Tuple <string, string, int, int?> > colDefs = new List <Tuple <string, string, int, int?> >(); foreach (frd_record_definition column in columns) { colDefs.Add(new Tuple <string, string, int, int?>(column.Name, column.ed_element_definition.DataType, column.Length, column.DecimalPlaces)); } dataAccess.CreateTable(tableName, colDefs, false, string.Empty); try { int size = (int)transaction.ftd_transaction_definition.FirstOrDefault().fr_record.RecordLength; using (StreamReader sr = new StreamReader(File.OpenRead(absolutePath), Encoding.UTF8, false, size)) { //calculate number of records to read //int recordCount = 0; //long fileLength = sr.BaseStream.Length; //int totalHeaderSize = (transaction.HeaderLength ?? 0) * (transaction.HeaderCount ?? 1); //int totalTrailerSize = (transaction.TrailerLength ?? 0) * (transaction.TrailerCount ?? 1); //long recordBytes = fileLength - (totalHeaderSize + totalTrailerSize); //if (recordBytes > 0) //{ // recordCount = (int)Math.Ceiling((double)recordBytes / size); //} //bool hasTrailer = totalTrailerSize != 0; int recordLine = 1; string rowIdentifier = string.Empty; //skip header //readNext(sr, totalHeaderSize); //for (int x = 0; x < recordCount; x++) //{ string line = string.Empty; while ((line = sr.ReadLine()) != null) { //size = (x == recordCount-1) ? size-2 : size; //string recordString = readNext(sr, size); //if (recordString.Length != size) //{ // break; //} //string lineIdentifier = GetMltIdentifier(recordString, identifiers); string lineIdentifier = GetMltIdentifier(line, identifiers); if (string.IsNullOrEmpty(lineIdentifier)) { recordLine++; } else { rowIdentifier = lineIdentifier; recordLine = 1; } ftd_transaction_definition transDef = transactionDefinitions.Where(t => t.fr_record.Identifier == rowIdentifier).FirstOrDefault(); if (transDef != null) { fr_record record = transDef.fr_record; //check for new transaction if (rowIdentifier == identifiers[0] && row.Keys.Count > 0) { rows.Add(row); row = new Dictionary <string, object>(); } //Dictionary<string, object> rowValues = GetMltRowValues(recordString, record, recordLine); Dictionary <string, object> rowValues = GetMltRowValues(line, record, recordLine); foreach (KeyValuePair <string, object> rowValue in rowValues) { row.Add(rowValue.Key, rowValue.Value); } } if (rows.Count == 20) { dataAccess.InsertDynamicWithColumns(connection, tran, tableName, 0, distribution, rows, columns.Select(c => c.Name).ToList()); rows.Clear(); } } } if (row.Keys.Count > 0) { rows.Add(row); } if (rows.Count > 0) { dataAccess.InsertDynamicWithColumns(connection, tran, tableName, 0, distribution, rows, columns.Select(c => c.Name).ToList()); } tran.Commit(); result = true; } catch (Exception ex) { tran.Rollback(); } finally { connection.Close(); } return(result); }
//private void validateTargetTable(string tableName, bool xmlFile, DateTime fileDefLastUpdated, List<frd_record_definition> columns) //{ // //version table if file def changed since the table was created // if (dataAccess.TableExists(tableName)) // { // //get table created date and compare to definition changed date // DateTime tableCreatedDate = dataAccess.GetTableCreatedDate(tableName); // Logger.GetLogger().WriteDebug($"Table:'{tableName}' created:{tableCreatedDate.ToString("dd/MM/yyyy hh:mm")} definition last changed:{fileDefLastUpdated.ToString("dd/MM/yyyy hh:mm")}"); // if (tableCreatedDate <= fileDefLastUpdated) // { // dataAccess.VersionTable(tableName, xmlFile); // } // } // //re-check because table may have been versioned - create table if does not exist // if (!dataAccess.TableExists(tableName)) // { // createTable(tableName, xmlFile, columns, dataAccess); // } //} private bool WriteMultiRecordType(string absolutePath, Encoding encoding, string distribution, ft_transaction transaction) { bool result = false; //handle multi line tagged file if (string.Equals(transaction.ftd_transaction_definition.FirstOrDefault().fr_record.Template, "mlt", StringComparison.OrdinalIgnoreCase)) { result = WriteMltRecordType(absolutePath, string.Empty, transaction); } else { throw new NotImplementedException("Multi-transactioned based files not implemented yet."); } return(result); }
public bool WriteToStore(string absolutePath, ft_transaction transaction) { //multi record file return(WriteMultiRecordType(absolutePath, Encoding.UTF8, string.Empty, transaction)); }
private void writeTable(string absolutePath, FileParseWriterSQL fileParseWriter, ft_transaction transaction) { //write to the store if (!fileParseWriter.WriteToStore(absolutePath, transaction)) { } }