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

时间:2015-01-20 06:34:31

标签: asp.net sql-server excel asp.net-mvc-4 sqlbulkcopy

我正在创建一个asp.net mvc4应用程序,它可以从excel表中将数据写入数据库表(使用sqlbulkcopy列映射)。当我们选择excel表并提交时,它将数据写入数据库。

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

代码:

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

1 个答案:

答案 0 :(得分:0)

只需将另一列创建为“TimeStamp_Inserted”,但其类型应为 datetime 或 的 nvarchar的 并尝试替换以下代码段

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

试试吧