/// <summary> /// Read from csv file line by line. /// </summary> /// <param name="path">Path to csv file.</param> /// <returns>Number of failed lines.</returns> public static int ImportFile(string path) { MessageSender.SendReport(">> Importing file: " + path + Environment.NewLine); int countNewContacts = 0; int countUpdatedContacts = 0; int lineNumber = 0; //read from file using (StreamReader file = new StreamReader(path)) { // skip header line string line = file.ReadLine(); while ((line = file.ReadLine()) != null) { lineNumber++; string[] items = line.Split('\t'); //check if line contains right amount of items if (items.Length < 5 || items.Length > 7) { MessageSender.SendReport("Line " + lineNumber + ": Invalid number of items." + Environment.NewLine); continue; } //parse line to contact data transfer object ContactDTO contact = ParseLineToContactDTO(items, lineNumber); if (contact == null) { //parsing failed continue; } if (ContactValidator.ValidateContact(contact, lineNumber)) { if (ContactToDbFeeder.LineToDbFeed(contact) == true) { countNewContacts++; } else { countUpdatedContacts++; } } } } MessageSender.SendReport("Succesfully added " + countNewContacts + " contacts." + Environment.NewLine); MessageSender.SendReport("Succesfully updated " + countUpdatedContacts + " contacts." + Environment.NewLine); return(lineNumber - (countNewContacts + countUpdatedContacts)); }
/// <summary> /// Decide if contact will be added as new or update exisiting contact. /// </summary> /// <param name="newContact">Contact data tranfer object.</param> /// <returns>True if contact was added as new, else false.</returns> public static bool LineToDbFeed(ContactDTO newContact) { //check if birth number is not null and already exists in databse DbContactsEntities database = new DbContactsEntities(); if (newContact.BirthNumber != null && database.Persons.Any(person => person.BirthNumber == newContact.BirthNumber)) { //update contact DbUpdateContact(newContact, database); return(false); } else { //add new contact DbAddContact(newContact, database); return(true); } }
/// <summary> /// Update existing contact in database. /// </summary> /// <param name="newContact">Contact data transfer object.</param> /// <param name="database">Database of contact entities.</param> private static void DbUpdateContact(ContactDTO newContact, DbContactsEntities database) { try { //find existing contact Person existingPerson = database.Persons.First(p => p.BirthNumber == newContact.BirthNumber); //update informations existingPerson.Name = newContact.Name; existingPerson.Surname = newContact.Surname; existingPerson.Address = newContact.Address; //update phone numbers for (int i = 0; i < newContact.PhoneNumbers.Length; i++) { existingPerson.PhoneNumbers.ElementAt(i).PNumber = newContact.PhoneNumbers[i]; } database.SaveChanges(); } catch (Exception ex) { MessageSender.SendReport(ex.ToString()); } }
/// <summary> /// Base method for validating each property of contact; /// </summary> /// <param name="contact">Contact data tranfer object.</param> /// <param name="lineNumber">Line number in the source csv.</param> /// <returns>True if contact is valid, else false.</returns> public static bool ValidateContact(ContactDTO contact, int lineNumber) { ContactValidity = true; LineNumber = lineNumber; //check if required Surname is present if (contact.Surname == "") { MessageSender.SendReport("Line " + lineNumber + ": Surname is missing. Line failed to import." + Environment.NewLine); return(false); } ValidateTextItem(contact.Name, 100, "Name"); ValidateTextItem(contact.Surname, 100, "Surname"); ValidateBirthNumber(contact.BirthNumber); ValidateTextItem(contact.Address, 255, "Address"); //validate all phone numbers foreach (int?number in contact.PhoneNumbers) { ValidatePhoneNumber(number); } return(ContactValidity); }