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.