为多个数据库行设置一个常量(相同)时间戳

set a constant(same) time stamp for multiple data base rows

我正在创建一个 asp.net mvc4 应用程序,它可以将数据从 excel sheets 写入数据库 tables(使用 sqlbulkcopy 列映射)。当我们select excel sheet 提交的时候,就是在往数据库中写入数据。

现在我想将数据写入数据库时​​,将文件上传时间设置为每个数据行的时间戳table。

代码:

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();
        }
    }
}

只需创建另一列作为 "TimeStamp_Inserted" 但其类型应为 datetimenvarchar 并尝试替换以下代码片段

             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)";

sqlbulkcopy 列映射尝试这样改变

                        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();

试试吧