One of the biggest issues is to load files or other type of formats in a standard database, before doing something with the data. Although this can be achieve using an automated way, sometimes business requirements leads to creating a specific workflow for data loading. This is one approach to the workflow:
1. Create your form for the upload
2. Create your DB Structure
3. Create your connection string to communicate with the DB
App
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <connectionStrings> <add name="prod" connectionString="server=serverName; database=dbName; UID=databaseUser;password=password;Trusted_Connection = False"/> </connectionStrings> </configuration>
4. Create the Form structure to handle the excel reading as well sending the data to the DAO class for the bulk Upload
Form1
using ExcelDataReader; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace TaskUploader { public partial class Form1 : Form { String conn; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { try { label2.Text = ""; textBox1.ReadOnly = true; textBox1.Text = "No files selected"; conn = ConfigurationManager.ConnectionStrings["prod"].ConnectionString; button2.Enabled = false; } catch (Exception ex) { label2.Text = "Error: " + ex.Message; throw new System.Exception("Error: " + ex.Message); } } private void button1_Click(object sender, EventArgs e) { try { openFileDialog1.Title = "Select Tasks"; openFileDialog1.FileName = ""; openFileDialog1.Filter = "Excel Files|*.xls;*.xlsx"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { textBox1.Text = openFileDialog1.SafeFileName; button2.Enabled = true; } } catch (Exception ex) { label2.Text = "Error: " + ex.Message; throw new System.Exception("Error: " + ex.Message); } } private void button2_Click(object sender, EventArgs e) { try { button2.Enabled = false; using (FileStream fs = File.Open(openFileDialog1.FileName, FileMode.Open, FileAccess.Read)) { IExcelDataReader reader = ExcelReaderFactory.CreateReader(fs); DataSet result = reader.AsDataSet(); TasksLocaleDao tasks = new TasksLocaleDao(); DataTable tasksColumns = tasks.getMetadata(conn); tasks.truncateTable(conn); if (tasks.insertTasks(tasksColumns, result, conn)) { String nRows = tasks.countRows(conn); MessageBox.Show("Transaction Completed: Inserted " + nRows + " rows."); } button2.Enabled = true; } } catch (Exception ex) { label2.Text = "Error: " + ex.Message; throw new System.Exception("Error: " + ex.Message); } } } }
5. Create your DAO class to save the data into the DB
DAO
using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TaskUploader { class TasksLocaleDao : ITasksLocale { string tableName = "TaskByLocale"; public String countRows(string connectionString) { SqlConnection myConnection = null; SqlCommand sqlcomm = null; DataTable dt = new DataTable(); try { using (myConnection = new SqlConnection()) { myConnection.ConnectionString = connectionString; myConnection.Open(); using (sqlcomm = new SqlCommand()) { sqlcomm.Connection = myConnection; sqlcomm.CommandType = CommandType.StoredProcedure; sqlcomm.CommandText = "TaskByLocale_CountTaskByLocale"; dt.Load(sqlcomm.ExecuteReader()); } } } catch (Exception e) { throw new System.Exception("No database access TaskByLocale__CountTaskByLocale -->" + e.Message); } finally { if (myConnection != null && myConnection.State == ConnectionState.Open) { myConnection.Close(); myConnection.Dispose(); } } return dt.Rows[0].ItemArray[0].ToString(); } public DataTable getMetadata(string connectionString) { SqlConnection myConnection = null; SqlCommand sqlcomm = null; DataTable dt = new DataTable(); try { using (myConnection = new SqlConnection()) { myConnection.ConnectionString = connectionString; myConnection.Open(); using (sqlcomm = new SqlCommand()) { sqlcomm.Connection = myConnection; sqlcomm.CommandType = CommandType.StoredProcedure; sqlcomm.Parameters.Add(new SqlParameter("@TableName", SqlDbType.NVarChar)).Value = this.tableName; sqlcomm.CommandText = "TaskByLocale_GetTableMetadata"; dt.Load(sqlcomm.ExecuteReader()); } } } catch (Exception e) { throw new System.Exception("No database access TaskByLocale_GetTableMetadata -->" + e.Message); } finally { if (myConnection != null && myConnection.State == ConnectionState.Open) { myConnection.Close(); myConnection.Dispose(); } } return dt; } public void truncateTable(string connectionString) { SqlConnection myConnection = null; SqlCommand sqlcomm = null; try { using (myConnection = new SqlConnection()) { myConnection.ConnectionString = connectionString; myConnection.Open(); using (sqlcomm = new SqlCommand()) { sqlcomm.Connection = myConnection; sqlcomm.CommandType = CommandType.StoredProcedure; sqlcomm.CommandText = "TaskByLocale_TruncateTaskByLocale"; sqlcomm.ExecuteReader(); } } } catch (Exception e) { throw new System.Exception("No database access TaskByLocale_TruncateTaskByLocale -->" + e.Message); } finally { if (myConnection != null && myConnection.State == ConnectionState.Open) { myConnection.Close(); myConnection.Dispose(); } } } public Boolean insertTasks(DataTable tasksColumns, DataSet result, string connectionString) { SqlBulkCopy copy = new SqlBulkCopy(connectionString); try { ArrayList columns = new ArrayList(); columns.Add(result.Tables[0].Rows[0].ItemArray.Select(x => x.ToString()).ToArray()); result.Tables[0].Rows.RemoveAt(0); result.Tables[0].Columns.RemoveAt(1); copy.ColumnMappings.Add(0, 0); copy.ColumnMappings.Add(1, 1); copy.ColumnMappings.Add(2, 2); copy.ColumnMappings.Add(3, 3); copy.ColumnMappings.Add(4, 4); copy.DestinationTableName = this.tableName; copy.WriteToServer(result.Tables[0]); } catch (Exception e) { throw new System.Exception("Error: " + e.Message); } finally { if (copy != null) { copy.Close(); } } return true; } } }
Talk with us
Do you want to find out more about this? Contact us to know what you might be missing out.
Find out more