Импорт данных из файла excel

В приведенном ниже коде данные импортируются из файла Excel, содержащего столбец Sent_date в формате MM/DD/YYYY. Каждая строка данных повторяется, и sent_date и значения даты сохраняются в переменной ex_date.

      protected void btnUpload_Click(object sender, EventArgs e)
    {

        MySqlTransaction transaction;

        string ex_id = "";
        var count = 0;



        string file_name = Path.GetFileName(FileUpload1.FileName);
        string Excel_path = Server.MapPath("~/Excel/" + file_name);
        FileUpload1.SaveAs(Excel_path);

        using (OleDbConnection my_con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Excel_path + ";Extended Properties=Excel 8.0;Persist Security Info=False"))
        {
            my_con.Open();

            // get the excel file data and assign it in OleDbcoomad object(o_cmd)
            using (OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", my_con))
            {

                // read the excel file data and assing it o_dr object
                using (OleDbDataReader dr = command.ExecuteReader())
                { 

                    /////////////////////////////////////////////
                   // while (dr.Read() && count++ < 10)
                   while(dr.Read())
                    {
                        //get first row data and assign it ex_id variable 
                        ex_id = dr[0].ToString();
                        string ex_uid = dr[1].ToString();
                        //get second row data and assign it ex_name variable
                        string ex_date = dr[2].ToString();
                        //get thirdt row data and assign it ex_name variable

                        string ex_dir = dr[3].ToString();

                        //get first row data and assign it ex_location variable
                        string ex_email = dr[4].ToString();
                        string ex_email1 = dr[5].ToString();
                        string ex_email2 = dr[6].ToString();
                        //string ex_company = dr[7].ToString();
                        string ex_company = dr[7].ToString();
                        string ex_contact = dr[8].ToString();
                        string ex_proposal = dr[9].ToString();
                        string ex_reason = dr[10].ToString();
                        //string ex_type = dr[11].ToString();

                        int chk = 0;
                        int type = 0;
                        int dup = 0;
                        int dir = 0;

                        if (ddlwebsites.SelectedIndex != 0)
                        {
                            dir = Convert.ToInt32(ddlwebsites.SelectedValue);
                            if (dir == 8)
                            {
                                type = 1;
                            }

                        }


                        foreach (ListItem lstAssign in ddlevents.Items)
                        {
                            if (lstAssign.Selected == true)
                            {
                                chk = 1;
                            }
                        }

                        if (type == 1 && chk == 0)
                        {
                            evyerror.Text = "Please Select the Event!!";
                            return;

                        }

                        else
                        {
                            string querycomp = "", compID = "";
                            querycomp = "Select * from barter_company where website like '%' '" + ex_dir + "' '%'";
                            string connStr = ConfigurationManager.ConnectionStrings["BarterConnectionString"].ToString();
                            connect = new MySqlConnection(connStr);
                            connect.Open();
                            transaction = connect.BeginTransaction();
                            try
                            {
                                ClassDtBaseConnect clsDtResult = new ClassDtBaseConnect();
                                DataTable dt = clsDtResult.GetDataTable(querycomp);
                                if (dt.Rows.Count > 0)
                                {
                                    compID = dt.Rows[0]["comp_id"].ToString();
                                    ViewState["comp_id"] = compID;
                                    if (type == 1)
                                    {
                                        dup = checkforDuplicates(Convert.ToInt32(compID));
                                        if (dup == 1)
                                        {
                                            //Confirm_MP.Show();
                                            // ScriptManager.RegisterStartupScript(this, this.GetType(), "script", "confirmation();", true);
                                        }

                                    }
                                    //return;
                                }
                                else
                                {

                                    string queryStr = "insert into barter_company (comp_name,website) values(?comp,?website)";
                                    MySqlCommand cmd = new MySqlCommand(queryStr, connect, transaction);
                                    cmd.Parameters.AddWithValue("?comp", ex_company);
                                    cmd.Parameters.AddWithValue("?website", ex_dir);
                                    cmd.ExecuteNonQuery();
                                    cmd.CommandText = "Select LAST_INSERT_ID()";
                                    compID = cmd.ExecuteScalar().ToString();
                                    transaction.Commit();
                                    connect.Close();

                                }
                            }
                            catch
                            {
                                transaction.Rollback();
                            }





                            if (dup == 0)
                            {
                                // create a connection string with your sql database 
                                string connStr1 = ConfigurationManager.ConnectionStrings["BarterConnectionString"].ToString();
                                connect = new MySqlConnection(connStr1);
                                connect.Open();

                                DateTime date = new DateTime();//added by chetan
                                ex_date = ex_date.Split(' ')[0];//added by chetan
                                date = DateTime.ParseExact(ex_date, "MM/dd/yyyy", null);//added by chetan
                                string SentDateString = date.ToString("yyyy/MM/dd");//added by chetan
                                DateTime SentDate = Convert.ToDateTime(SentDateString).Date;//added by chetan
                                                                                            //DateTime SentDate = DateTime.Parse(ex_date);//added by chetan


                                // }
                                //date = DateTime.ParseExact(ex_date, "MM/dd/yyyy", System.Globalization.CultureInfo.InvariantCulture);//added by chetan
                                //date = DateTime.ParseExact(ex_date, "MM/dd/yyyy", null);
                                // string SentDateString = date.ToString("yyyy/MM/dd");
                                transaction = connect.BeginTransaction();
                                try
                                {

                                    ex_uid = Session["session_barterUser_id"].ToString();


                                    MySqlCommand cmd = new MySqlCommand("insert into barter_proposals(user_id, sent_date, website_a, email_id, email_id2, email_id3, company, contact_name, proposal_status, reason,type) values(?uid,?sentdate,?dir,?email,?email2,?email3,?comp,?cont_name,?pro_status,?reason,?type)", connect);

                                    cmd.Parameters.AddWithValue("?uid", ex_uid);
                                    cmd.Parameters.AddWithValue("?comp", compID);

                                    cmd.Parameters.AddWithValue("?sentdate", SentDate);
                                    // command.Parameters.AddWithValue("?event", eventname);
                                    cmd.Parameters.AddWithValue("?dir", dir);
                                    // command.Parameters.AddWithValue("?bar_type", ddlbartertype.SelectedValue);
                                    // command.Parameters.AddWithValue("?website_b", txtwebsite.Text);
                                    //cmd.Parameters.AddWithValue("?comp", ex_company);
                                    cmd.Parameters.AddWithValue("?cont_name", ex_contact);
                                    cmd.Parameters.AddWithValue("?email", ex_email);
                                    cmd.Parameters.AddWithValue("?email2", ex_email1);
                                    cmd.Parameters.AddWithValue("?email3", ex_email2);
                                    cmd.Parameters.AddWithValue("?pro_status", ex_proposal);
                                    cmd.Parameters.AddWithValue("?reason", ex_reason);
                                    cmd.Parameters.AddWithValue("?type", type);
                                    // command.Parameters.AddWithValue("?type", type);

                                    cmd.ExecuteNonQuery();
                                    if (type == 1)
                                    {

                                        cmd.CommandText = "Select LAST_INSERT_ID()";
                                        Int64 CurrentProId = Convert.ToInt64(cmd.ExecuteScalar());
                                        int eventAssignID;
                                        string QueryInqEventAssign = "insert into barter_propeventassign(prop_id,event_id) values(?pro_id,?event_id)";

                                        foreach (ListItem lstAssign in ddlevents.Items)
                                        {
                                            if (lstAssign.Selected == true)
                                            {
                                                cmd = new MySqlCommand(QueryInqEventAssign, connect, transaction);
                                                cmd.Parameters.AddWithValue("?pro_id", CurrentProId);
                                                eventAssignID = Convert.ToInt32(lstAssign.Value);
                                                cmd.Parameters.AddWithValue("?event_id", eventAssignID);
                                                cmd.ExecuteNonQuery();

                                            }
                                        }

                                    }//end of if
                                    transaction.Commit();
                                    connect.Close();
                                    Response.Write("<script type=\"text/javascript\">alert('Proposal Added Successfully!!!');</script>");
                                }//end of try
                                catch (Exception ex)
                                {
                                    transaction.Rollback();
                                    Response.Write("<script>alert('There is an Error Ocurred:" + Server.HtmlEncode(ex.Message) + "')</script>");
                                }
                                finally
                                {
                                    connect.Close();

                                }

                            }//ifdupzero
                        }//else
                    }//while   


            //dr.Close();//commented by chetan
        }//using
    }//using

  }//using

        if (System.IO.File.Exists(Excel_path))
        {
            System.IO.File.Delete(Excel_path);
        }


    }

Теперь проблема в том, что предположим, что файл excel содержит 3 строки, как показано ниже:

sent_date
11/21/2017----1strow
11/22/2017----2ndrow
11/23/2017----3rdrow

Reader читает 3 строки, но не останавливается после этого. Он снова переходит в цикл while и считывает дату (фактическое значение: "") и выдает ошибку "string is not recognised as datetime".

Наблюдается странная вещь, что при импорте 16 строк он не выдает эту ошибку - читатель останавливается и данные вставляются. Понятия не имею, почему для остановки reader требуется 16 строк.

Что нужно добавить в код, чтобы читатель остановился после прочтения начальных 3-х строк - то есть после прочтения 3-й строки, как он пойдет на dr.close()?


person Community    schedule 08.12.2017    source источник
comment
весь смысл using в том, что он очищает соединение. не вызывайте Close явно. О, и используйте правильные соглашения об именах C #   -  person Aluan Haddad    schedule 08.12.2017
comment
Как остановиться после 3 ряда? var count = 0; while (dr.Read() && count++ < 3) {}   -  person Aluan Haddad    schedule 08.12.2017
comment
что, если есть 10 строк? На самом деле он должен импортировать в соответствии с количеством строк в файле Excel...   -  person    schedule 08.12.2017
comment
Это зависит от того, как выглядят ваши данные. Если у вас стандартный формат, то разобраться можно. В противном случае вы можете либо проверить значение и условно проанализировать его, используя DateTime.TryParseExact вместо ParseExact, либо перехватить исключение и return из прилагающего метода.   -  person Aluan Haddad    schedule 08.12.2017
comment
количество переменных = 0; while (dr.Read() && count++ ‹ 9) {}..... Итак, если в файле Excel 12 строк, из файла Excel потребуется только 9 строк... верно?   -  person    schedule 08.12.2017
comment
Правильно, я не знал ваших требований. Единственный способ перестать сталкиваться с неверными данными?   -  person Aluan Haddad    schedule 08.12.2017
comment
Возможно ли, что если читатель проверяет, содержит ли строка данные или нет в файле excel... если 1strow содержит данные, то он может войти внутрь цикла while и выполнить выполнение... если 2-я строка пуста, читатель должен закрыться ...   -  person    schedule 08.12.2017
comment
Читатель всегда автоматически закрывается из-за оператора using. Вы должны удалить свои близкие утверждения, они не имеют никакого смысла. Смысл оператора using в том, что он очищает ресурсы, такие как соединения, независимо от того, как вы выходите из блока. Даже если возникнет исключение, очистка гарантирована. Это цель конструкции   -  person Aluan Haddad    schedule 08.12.2017
comment
И это то, что я сказал в своем первом комментарии, почему вы не читаете?   -  person Aluan Haddad    schedule 08.12.2017
comment
Я удалил dr.close() и mycon.close()......Точно @AluanHaddad...читатель должен быть автоматически закрыт после импорта данных из файла excel..но в моем случае предположим,если есть 7 строк, которые я хотел импортировать из Excel, поэтому после импорта 7 строк он не закрывается... он снова входит в цикл while в 8-й раз и читает дату (фактическое значение:)...   -  person    schedule 08.12.2017
comment
вы ходите по кругу. Речь идет не о закрытии считывателя, а о выходе из цикла. Это проблема, которую вы должны решить.   -  person Aluan Haddad    schedule 08.12.2017
comment
количество переменных = 0; в то время как (dr.Read() && count++ ‹ 9) ....это для установки ограничения, т.е. пользователь может импортировать только 9 строк......пока(dr.Read())..это для импорта столько строк из файла excel... Для ограничения, var count = 0; в то время как (dr.Read() && count++ ‹ 9) отлично работает, т.е. я могу импортировать только 9 строк из n строк.... Но для while(dr.Read())... допустим, если есть 7 строк, которые я хотел импортировать из excel, поэтому после импорта 7 строк он не закрывается....   -  person    schedule 08.12.2017
comment
он всегда закрыт, это не проблема. Проблема в том, что вы получаете исключение, и ваша программа завершается. Читалка по-прежнему закрыта. Есть так много способов решить эту проблему. Вам нужно вернуться к основам. Изучите основные логические требования   -  person Aluan Haddad    schedule 08.12.2017
comment
Я только что добавил свой фактический код... пожалуйста, проверьте и просто дайте мне знать, если я где-то ошибаюсь   -  person    schedule 08.12.2017
comment
да что-то очень не так. Вы не можете поддерживать этот код. У вас есть весь ваш код в одном методе, который равен 200 строкам, не делайте этого. Вариабельная мутация везде, куда ни глянь. Если вы понимаете код сейчас, вы не поймете, когда посмотрите на него через месяц.   -  person Aluan Haddad    schedule 08.12.2017
comment
Черт, даже перепутал запись потока ответов через HTTP с логикой базы данных. Как вы ожидаете, что кто-то будет поддерживать этот код?   -  person Aluan Haddad    schedule 08.12.2017
comment
И что еще хуже, поток сериализует HTML, который содержит встроенный JavaScript для оценки на клиенте. У вас есть по крайней мере четыре языка программирования в одной гигантской функции, и три из этих языков сидят в строках, все это нужно выбросить и начать сначала.   -  person Aluan Haddad    schedule 08.12.2017
comment
все работает отлично...данные вставляются в базу...только проблема в цикле...   -  person    schedule 08.12.2017
comment
этот код неприемлем. Вы говорите, что это работает отлично, за исключением петли, но есть гигантская петля вокруг стольких разных проблем. Пожалуйста, рассмотрите возможность изучения базовой декомпозиции процедурного программирования. Ничего особенного, заметьте, просто как иметь несколько методов, которые делают разные вещи, а затем составлять их.   -  person Aluan Haddad    schedule 08.12.2017


Ответы (1)


При чтении файла Excel вам необходимо учитывать концепцию пустых/используемых строк. Если вы удалите строки из Excel после 3 строк и снова импортируете их, проблема не возникнет.

Согласно вашему объяснению, в excel всего 16 используемых строк, но данные заполняются только в 3 строках.

Чтобы выйти из цикла while после 3 строк данных, вам нужно будет ввести более исчерпывающее условие where, например "SELECT * FROM [Sheet1$] WHERE [F1] ‹> ''"

person Sarana    schedule 08.12.2017