Code On Time web apps come with a native CSV Import processor that will parse comma separated files and create new records. However, this native processor does not display any errors that may have occurred due to malformed CSV. Let’s override methods in the processor in order to handle and report these errors.
Start the app generator. Click on the project name, and press Develop to open the project in Visual Studio. In the Solution Explorer, right-click on ~/App_Code folder and press Add | Class.
Assign a name to the item and press OK to save. Replace the code base with the following:
C#:
using System; using System.Collections.Generic; using System.IO; using MyCompany.Data; using System.Net.Mail; namespace MyCompany.Data { public partial class CsvImportProcessor { protected override bool HandleError(ActionResult r, ActionArgs args) { string dir = AppDomain.CurrentDomain.BaseDirectory; using (StreamWriter file = new StreamWriter(dir + "\\ImportErrorLog.txt", true)) { foreach (string s in r.Errors) file.WriteLine(String.Format("{0:s}: {1}",DateTime.Now, s)); } return true; } protected override void ReportErrors(string controller, string recipients, string logFileName) { string[] recipientsList = recipients.Split(','); SmtpClient client = new SmtpClient(); foreach (string s in recipientsList) { string address = s.Trim(); if (!(String.IsNullOrEmpty(address))) { MailMessage message = new MailMessage(); try { message.To.Add(new MailAddress(address)); message.Subject = String.Format("Import of {0} has been completed", controller); message.Body = File.ReadAllText(logFileName); client.Send(message); } catch (Exception) { } } } } } }
Visual Basic:
Imports Microsoft.VisualBasic Imports System.IO Imports MyCompany.Data Imports System.Net.Mail Namespace MyCompany.Data Partial Public Class CsvImportProcessor Protected Overrides Function HandleError(r As ActionResult, args As ActionArgs) As Boolean Dim dir As String = AppDomain.CurrentDomain.BaseDirectory Using file As StreamWriter = New StreamWriter(dir + "\\ImportErrorLog.txt", True) For Each s As String In r.Errors file.WriteLine(String.Format("{0:s}: {1}", DateTime.Now, s)) Next Return True End Using End Function Protected Overrides Sub ReportErrors(controller As String, recipients As String, logFileName As String) Dim recipientsList() As String = recipients.Split(Global.Microsoft.VisualBasic.ChrW(44)) Dim client As SmtpClient = New SmtpClient() For Each s As String In recipientsList Dim address As String = s.Trim() If Not (String.IsNullOrEmpty(address)) Then Dim message As MailMessage = New MailMessage() Try message.To.Add(New MailAddress(address)) message.Subject = String.Format("Import of {0} has been completed", controller) message.Body = File.ReadAllText(logFileName) client.Send(message) Catch __exception As Exception End Try End If Next End Sub End Class End Namespace
The first method above will create a file “ImportErrorLog.txt” in the application folder and write every error that occurred. It returns true in order to cancel the default handling. The second method overrides the default error reporting and sends an email to the specified recipient. This requires web app SMTP configuration. If a malformed CSV file was imported, the ImportErrorLog.txt file will look like the picture below.