définir un horodatage constant (identique) pour plusieurs lignes de la base de données

asp.net asp.net-mvc-4 excel sqlbulkcopy sql-server

Question

Je crée une application asp.net mvc4, capable d'écrire des données dans des tables de base de données à partir de feuilles Excel (à l'aide du mappage de colonnes sqlbulkcopy). Lorsque nous sélectionnons et soumettons une feuille Excel, nous enregistrons des données dans une base de données.

Maintenant, je veux définir l'heure de chargement du fichier comme horodatage pour chaque ligne de données lors de l'écriture de données dans la table de base de données.

Code:

namespace AFFEMS2_HEC.Controllers
{
    public class ExcelController : Controller
    {
        //
        // GET: /Excel/

        public ActionResult Index()
        {
            return View();
        }


        [HttpPost]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(HttpPostedFileBase FileUpload1)
        {
            //Upload and save the file
            if (Request.Files["FileUpload1"].ContentLength > 0)
            {
                string excelPath = Path.Combine(HttpContext.Server.MapPath("~/Content/"), Path.GetFileName(FileUpload1.FileName));

                FileUpload1.SaveAs(excelPath);

                string conString = string.Empty;
                string extension = Path.GetExtension(FileUpload1.FileName);
                switch (extension)
                {
                    case ".xls": //Excel 97-03
                        conString = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString;
                        break;
                    case ".xlsx": //Excel 07 or higher
                        conString = ConfigurationManager.ConnectionStrings["Excel07+ConString"].ConnectionString;
                        break;

                }
                conString = string.Format(conString, excelPath);
                using (OleDbConnection excel_con = new OleDbConnection(conString))
                {

                    string sheet1 = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["TABLE_NAME"].ToString();
                    string sheet2 = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[1]["TABLE_NAME"].ToString();

                    DataTable dtExcelData = new DataTable();


                    //[OPTIONAL]: It is recommended as otherwise the data will be considered as String by default.

                    dtExcelData.Columns.AddRange(new DataColumn[4] { 
                    new DataColumn("Id", typeof(string)),
                    new DataColumn("Name", typeof(string)),
                    new DataColumn("Email",typeof(string)),
                    new DataColumn("Mobile", typeof(int)) });


                    string query = "SELECT s1.Id, " + 
                                        "s1.Name, " +
                                        "s1.Mobile, " + 
                                        "s2.Email " + 
                                        "FROM ([" + sheet1 + "] as s1 INNER JOIN [" + sheet2 + "] as s2 ON " + "s1.Id = s2.Id)";

                    using (OleDbDataAdapter oda = new OleDbDataAdapter(query, excel_con))
                    {
                        oda.Fill(dtExcelData);
                    }
                    excel_con.Close();

                    string consString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
                    using (SqlConnection con = new SqlConnection(consString))
                    {
                        using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con,
                                                    SqlBulkCopyOptions.CheckConstraints|
                                                    SqlBulkCopyOptions.FireTriggers|
                                                    SqlBulkCopyOptions.KeepNulls|
                                                    SqlBulkCopyOptions.TableLock|
                                                    SqlBulkCopyOptions.UseInternalTransaction,
                                                    null))
                        {
                            //Set the database table name
                            sqlBulkCopy.DestinationTableName = "User1";

                            sqlBulkCopy.ColumnMappings.Add("Id", "Id");
                            sqlBulkCopy.ColumnMappings.Add("Name", "Name");
                            sqlBulkCopy.ColumnMappings.Add("Email", "Email");
                            sqlBulkCopy.ColumnMappings.Add("Mobile", "Mobile");

                            con.Open();

                            try
                            {
                                // Write from the source to the destination
                                sqlBulkCopy.WriteToServer(dtExcelData);
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(ex.Message);
                            }
                            finally
                            {
                                con.Close();
                            }
                        }
                    }
                }

            }
            return View();
        }
    }
}

Réponse acceptée

Créez simplement une autre colonne en tant que "TimeStamp_Inserted" mais le type doit être datetime ou nvarchar et essayez de remplacer le fragment de code suivant.

             string query = "SELECT s1.Id, " + 
                                    "s1.Name, " +
                                    "s1.Mobile, " + 
                                    "s2.Email " + 
                                    "'"+DateTime.Now.ToString() +"'"+" as TimeStamp_Inserted"+
                                    "FROM ([" + sheet1 + "] as s1 INNER JOIN [" + sheet2 + "] as s2 ON " + "s1.Id = s2.Id)";

La cartographie des colonnes sqlbulkcopy essaie de changer comme ceci

                        sqlBulkCopy.DestinationTableName = "User1";

                        sqlBulkCopy.ColumnMappings.Add("Id", "Id");
                        sqlBulkCopy.ColumnMappings.Add("Name", "Name");
                        sqlBulkCopy.ColumnMappings.Add("Email", "Email");
                        sqlBulkCopy.ColumnMappings.Add("Mobile", "Mobile");

                        sqlBulkCopy.ColumnMappings.Add("TimeStamp_Inserted", "TimeStamp");

                        con.Open();

juste l'essayer



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi