Загрузить и обновить файл Excel - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть задача загрузить файл Excel, а также проверить наличие обновлений, если найдена та же запись. Я загрузил файл Excel в базу данных, которая работает нормально.

Теперь я должен проверить,вставляются те же записи, затем обновляются, в противном случае вставляются новые записи. Сначала у меня две таблицы. Я вставляю записи во временную таблицу, а затем проверяю временную таблицу с исходной таблицей.Вложенный в цикл для проверки записей, мой цикл работает нормально и вставляет две верхние записи, но когда дело доходит до 3-й записи, затем вставляйте ее несколько раз, а четвертую снова и снова несколько раз.пока что

       protected void btnUpload_Click(object sender, EventArgs e)
{
    try
    {
        int id;
        string contactPerson;
        string designation;
        string company;
        string contact;
        string emailaddress;
        string city;
        string region;
        string industry;
        string division;
        string mobile;
        string address;

        string path = Path.GetFileName(FileUpload1.FileName);
        path = path.Replace(" ", "");

        FileUpload1.SaveAs(Server.MapPath("~/uploadExcel/") + FileUpload1.FileName);
        String ExcelPath = Server.MapPath("~/uploadExcel/") + FileUpload1.FileName;
        OleDbConnection mycon = new OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + ExcelPath + "; Extended Properties=Excel 8.0; Persist Security Info = False");

        mycon.Open();

       DeleteRecords();

        OleDbCommand cmd = new OleDbCommand("select * from [Sheet1$]", mycon);
        OleDbDataReader dr = cmd.ExecuteReader();
        while (dr.Read())
        {
            if (dr[0].ToString() != "")
            {
                // Response.Write("<br/>"+dr[0].ToString());
                id = Convert.ToInt32(dr[0].ToString());
                contactPerson = dr[1].ToString();
                designation = dr[2].ToString();
                company = dr[3].ToString();
                emailaddress = dr[4].ToString();
                contact = dr[5].ToString();
                mobile = dr[6].ToString();
                address = dr[7].ToString();
                city = dr[8].ToString();
                region = dr[9].ToString();
                industry = dr[10].ToString();
                division = dr[11].ToString();

                InsertTemp(id, contactPerson, designation, company, emailaddress, contact,
                 mobile, address, city, region, industry, division);

                //InsertOrignal(id, contactPerson, designation, company, emailaddress, contact,
                // mobile, address, city, region, industry, division);

            }

            else
            {
                break;
            }


            String myconn = "Data Source=Ali-PC;Initial Catalog=MushkhoApp;Integrated Security=True";
            SqlConnection conn = new SqlConnection(myconn);
            conn.Open();
            DataTable dt_temp = new DataTable();
            DataTable dt_orignal = new DataTable();
            SqlDataAdapter da_temp = new SqlDataAdapter("select * from Tbl_ExcelData order by id asc", conn);
            SqlDataAdapter da_orignal = new SqlDataAdapter("select * from Tbl_ExcelUploadData order by id asc", conn);

            da_temp.Fill(dt_temp);
            da_orignal.Fill(dt_orignal);


            if (dt_orignal.Rows.Count > 0)
            {

                for (int i = 0; i < dt_temp.Rows.Count; i++)
                {
                    for (int j = 0; j < dt_orignal.Rows.Count; j++)
                    {
                        if (dt_temp.Rows[i]["email"].ToString() == dt_orignal.Rows[j]["email"].ToString())
                        {
                            //Update Record if required
                        }
                        else
                        {
                            //insert record into orignal table


                            InsertOrignal(id, contactPerson, designation, company, emailaddress, contact, mobile, address, city, region, industry, division);


                        }
                    }

                }
            }

            else
            {
                InsertOrignal(id, contactPerson, designation, company, emailaddress, contact, mobile, address, city, region, industry, division);

            }

        }

       lblmessage.Text = "Data Has Been Updated Successfully";

        mycon.Close();
        File.Delete(ExcelPath);

    }
    catch (Exception ex)
    {

        Console.WriteLine(ex.Message);
    }



}



private void InsertTemp(int id, String contactPerson, String designation, String company, String emailaddress, 
                             String contact, String mobile, String address,String city,String region,String industry,
                             String division)
{


    //String mycon = "Data Source=Ali-PC;Initial Catalog=MushkhoApp;Integrated Security=True";
    SqlConnection con = new SqlConnection(mycon);
    con.Open();




            string query = "insert into Tbl_ExcelData (id,contactperson,designation,company,email,contact,mobile,address,city,region,industry,division) values('" + id + "','" + contactPerson + "', '" + designation + "','" + company + "','" + emailaddress + "','" + contact + "','" + mobile + "','" + address + "','" + city + "','" + region + "','" + industry + "','" + division + "')";

            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = query;
            cmd.Connection = con;
            cmd.ExecuteNonQuery();

        }


private void InsertOrignal(int id, String contactPerson, String designation, String company, String emailaddress,
                            String contact, String mobile, String address, String city, String region, String industry,
                            String division)
{


    //String mycon = "Data Source=Ali-PC;Initial Catalog=MushkhoApp;Integrated Security=True";
    SqlConnection con = new SqlConnection(mycon);
    con.Open();




    string query = "insert into Tbl_ExcelUploadData (id,contactperson,designation,company,email,contact,mobile,address,city,region,industry,division) values('" + id + "','" + contactPerson + "', '" + designation + "','" + company + "','" + emailaddress + "','" + contact + "','" + mobile + "','" + address + "','" + city + "','" + region + "','" + industry + "','" + division + "')";

    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = query;
    cmd.Connection = con;
    cmd.ExecuteNonQuery();

}


private void DeleteRecords()
{

    SqlConnection con = new SqlConnection(mycon);
    con.Open();
    string query = "Delete from Tbl_ExcelData";
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = query;
    cmd.Connection = con;
    cmd.ExecuteNonQuery();

}


 }

1 Ответ

0 голосов
/ 21 сентября 2018

Если у вас есть временная таблица только для того, чтобы проверить, существует ли строка в исходной таблице, это не очень хорошая практика.

Непосредственно проверяйте, существует ли строка в вашей исходной таблице с помощью первичного ключа id или любой Unique Key и затем решите, Insert или Update.

Один из способов сделать это,

while (dr.Read()) 
{
    if (dr[0].ToString() != "") 
    {
       id = Convert.ToInt32(dr[0].ToString());        //add other columns which needs to be fetched from Excel
       string query = "select count(1) from Tbl_ExcelData where id=?";        //To check if the row already exsits    
       SqlCommand cmd = new SqlCommand(con);

       cmd.CommandText = query;
       cmd.Paramaters.Add(new SqlParameter(1, id));

       int count = (Int32) cmd.ExecuteScalar();

       if (count > 0) //which means row already exists
       {
          //Your update code goes here
       } 
       else 
       {
            InsertOrignal(id, contactPerson, designation, company, emailaddress, contact, mobile, address, city, region, industry, division);
       }
}

После комментариев, вот основная идея.Один из способов, которым вы можете загрузить свои данные Excel в DataTable, просмотреть их и выбрать Upsert.Не забудьте узнать о MultipleActiveResultSets

try
{
    string ExcelPath = Server.MapPath("~/uploadExcel/") + FileUpload1.FileName;
    string _oleDBConnectionString = string.Format("Provider = Microsoft.ACE.OLEDB.12.0; Data Source = {0}; Extended Properties=Excel 8.0; Persist Security Info = False", ExcelPath);
    string _sqlConnectionString = "Data Source=Ali-PC;Initial Catalog=MushkhoApp;Integrated Security=True; MultipleActiveResultSets=true;"; //enable MultipleActiveResultSets as you'll be opening a nested SqlConnection
    string _excelQuery = "select * from [Sheet1$]";
    DataTable tempDataTable = null;

    using (var conn = new OleDbConnection(_oleDBConnectionString)) //This code loads your excel data into data table
    {
        conn.Open();
        using (var cmd = new OleDbCommand(_excelQuery, conn))
        {
            using (var reader = cmd.ExecuteReader())
            {
               var dt = new DataTable();

               dt.Load(reader); //this will load your excel data into DataTable

               tempDataTable = dt;
            }
        }
    }

    using(var sqlConn = new SqlConnection(_sqlConnectionString)) //this code will connect to sql db and upsert based on the id from the excel
    {
        sqlConn.Open();

        string countQuery = "select count(1) from Tbl_ExcelData where id=:id";    

        using(var cmd = new SqlCommand(countQuery, sqlConn))
        {
            var param = new SqlParameter("@id");

            foreach (DataRow row in tempDataTable.Rows) //this will loop through the DataTable rows, the actual rows from Excel which are loaded into DataTable
            {
                var id = row["id"]; //get the id column from the excel
                var contactPerson = row["contactPerson"]; //get the contactPerson column from the excel

                cmd.Paramaters["@id"] =  id;

                int count = (int) cmd.ExecuteScalar();

                if (count) //row already exist in original table
                {
                    //update the row in original table
                }
                else
                {
                    //insert the row in original table
                    InsertOriginal(sqlConn, id, contactPerson);
                }
            }               
        }
     }
 }
 catch(Exception ex)
 {
 }

function InsertOriginal(SqlConnection conn, int id, string contactPerson)
{
    string insertQuery = "insert into Tbl_ExcelUploadData (id,contactpersonn) values('@id','@contactPerson');

    using(var cmd = new SqlCommand(insertQuery, conn))
     {
         cmd.Parameters.Add(new SqlParameter("@id",id));
         cmd.Parameters.Add(new SqlParameter("@contactPerson", contactPerson));
         cmd.ExecuteNonQuery();
     }
}

Кроме того, это не проверенный код.Не стесняйтесь комментировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...