Uploading and Importing CSV file to SQL Server using WebAPI
Assumption: Basic knowledge of MVC and WebApiDownload Source code:
Few weeks ago I was working with a WebAPI services . These services are consumed by multiple devices like IOS,Andriod....which involves uploading CSV file to Sql Server database and thought I'd share the simple implementation that I did on the project which i will believe will save somebodies time. In this post I will demonstrate how to create WebApi and upload and import CSV file to SQL Server database.
Step 1: Create WebApi Service Application using your favourite IDE like shown below
Step 3: Modify UploadController with below class
public class UploadController : ApiController { [Route("api/Device/PostUpload")] [HttpPost] [ActionName("PostUpload")] public string PostUpload() { string individualExtractPath = null; StreamReader sr = null; try { HttpRequest request = HttpContext.Current.Request; //making file unique,you can use GUID also string fileName = request.Files[0].FileName + "_" + DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss"); string DeviceId = request.Form["DeviceId"]; //check for column key id if (DeviceId == null || "null".Equals(DeviceId.ToLower())) { return "UnRegistered"; } string strFileExtractPath = HttpRuntime.AppDomainAppPath; strFileExtractPath = Path.Combine(strFileExtractPath, "UploadExtract"); if (!Directory.Exists(strFileExtractPath)) { Directory.CreateDirectory(strFileExtractPath); } individualExtractPath = Path.Combine(strFileExtractPath, fileName); Directory.CreateDirectory(individualExtractPath); request.Files[0].SaveAs(individualExtractPath + "\\" + request.Files[0].FileName); string strUnzipedFilesLocation = Path.Combine(individualExtractPath, "unzipedFiles"); Directory.CreateDirectory(strUnzipedFilesLocation); ZipFile.ExtractToDirectory(individualExtractPath + "\\" + request.Files[0].FileName, strUnzipedFilesLocation); ArrayList fileList = new ArrayList(); // Get the files in the Directory string[] files = Directory.GetFiles(strUnzipedFilesLocation); int len = files.Length; for (int i = 0; i < len; i++) { string filename = files[i]; // Add into the ArrayList fileList.Add(System.IO.Path.GetFileName(filename)); FileInfo uploadFile = new FileInfo(filename); sr = new StreamReader(filename); DataTable oDataTable = null; int RowCount = 0; string[] ColumnNames = null; string[] oStreamDataValues = null; //using while loop read the stream data till end while (!sr.EndOfStream) { String oStreamRowData = sr.ReadLine().Trim(); if (oStreamRowData.Length > 0) { oStreamDataValues = oStreamRowData.Split(','); //Bcoz the first row contains column names, we will poluate //the column name by //reading the first row and RowCount-0 will be true only once if (RowCount == 0) { RowCount = 1; ColumnNames = oStreamRowData.Split(','); oDataTable = new DataTable(); //using foreach looping through all the column names foreach (string csvcolumn in ColumnNames) { DataColumn oDataColumn = new DataColumn(csvcolumn.ToUpper(), typeof(string)); //setting the default value of empty.string to newly created column oDataColumn.DefaultValue = string.Empty; //adding the newly created column to the table oDataTable.Columns.Add(oDataColumn); } } else { //creates a new DataRow with the same schema as of the oDataTable DataRow oDataRow = oDataTable.NewRow(); //using foreach looping through all the column names for (int c = 0; c < ColumnNames.Length; c++) { oDataRow[ColumnNames[c]] = oStreamDataValues[c] == null ? string.Empty : oStreamDataValues[c].ToString(); } //adding the newly created row with data to the oDataTable oDataTable.Rows.Add(oDataRow); } } } //close the oStreamReader object sr.Close(); //release all the resources used by the oStreamReader object sr.Dispose(); //Creating two additinal columns dynamically because mobile trip file doesn't provide that DataTable dtFinal = oDataTable; //Class Bulk Insert here BulkInsertTripFile(oDataTable); } return "File SuccessFully Posted"; } finally { try { if (!string.IsNullOrEmpty(individualExtractPath) && Directory.Exists(individualExtractPath)) { //If any such directory then creates the new one DeleteDirectory(individualExtractPath); } } catch (Exception ex) { throw ex; } } } /// <summary> /// After uploading file ,just need /// </summary> /// <param name="target_dir"></param> private static void DeleteDirectory(string target_dir) { string[] files = Directory.GetFiles(target_dir); string[] dirs = Directory.GetDirectories(target_dir); foreach (string file in files) { File.SetAttributes(file, FileAttributes.Normal); File.Delete(file); } foreach (string dir in dirs) { DeleteDirectory(dir); } Directory.Delete(target_dir, false); } /// <summary> /// Method for Trip Detail bulk insert with datatable as parameter /// </summary> /// <param name="dt"></param> private void BulkInsertTripFile(DataTable dt) { string connString = System.Configuration.ConfigurationManager.AppSettings["BulkDemo"]; // Copy the DataTable to SQL Server using (SqlConnection dbConnection = new SqlConnection(connString)) { dbConnection.Open(); using (SqlBulkCopy s = new SqlBulkCopy(dbConnection)) { s.DestinationTableName = "TripTable"; foreach (var column in dt.Columns) s.ColumnMappings.Add(column.ToString(), column.ToString()); s.WriteToServer(dt); } } } }
step 4:Create view based on html page or you can create android or ios page for uploading/posting file
Hope this helps ... Shabir