通过模型更新数据库的更快方法

时间:2013-11-17 05:30:37

标签: c# asp.net-mvc-4

我刚刚开始例行工作,将CSV文件从客户端Internet浏览器上传到服务器目录。然后将文件读入一个String数组,其中包含:

public HttpResponseMessage Upload()
{
    HttpPostedFile file = HttpContext.Current.Request.Files[0];
    var path = Path.Combine(
        HttpContext.Current.Server.MapPath("~/App_Data/uploads"), 
        file.FileName   );

    string[] Lines = System.IO.File.ReadAllLines(path);
    ReadCsv(Lines,file.FileName ); //......ETCETC

这一切都很好,但我的问题是速度。我知道我遇到的问题是我循环遍历数组中的每个记录并插入到我的模型中。我的问题是,我怎样才能更快地执行此操作。我说19,000行,它是一个90分钟的过程。文件上传需要10秒,20MB。一切都很好,我需要改变这个名为UploadCSV()的过程来复制记录,例如LINQ SQL语句,这意味着没有循环。有没有人有任何想法如何做到这一点?这是我的'慢程序'循环每条记录。我需要从Array到数据库更快,可能只需一步:

public void UploadCSV(String[] Lines, string filename)
{
    string[] Fields;
    Fields = Lines[0].Split(new char[] { '|' });
    int Cols = Fields.GetLength(0);

    for (int i = 1; i < Lines.GetLength(0); i++)
    {
        Fields = Lines[i].Split(new char[] { '|' });

        Water water = new Water()
        {
            SupplyPointId = decimal.Parse(Fields[0].ToString()),
            D2002_ServiceCategory = int.Parse(Fields[1]),
            D2003_Schedule3 = decimal.Parse(Fields[2]),
            D2004_ExemptCustomerFlag = (Fields[3].ToString() == "1" 
                ? true : false),
            D2005_CustomerClassification = Fields[4].ToString(),
            D2006_29e = decimal.Parse(Fields[5]),
            D2007_LargeVolAgreement = (Fields[6].ToString() == "1" 
                ? true : false),
            D2008_SICCode = (Fields[7].ToString() == "" ? -1 : int.Parse(Fields[7].ToString())),
            D2011_RateableValue = decimal.Parse(Fields[8]),
            D2014_FarmCroft = Fields[9].ToString(),
            D2015_SPIDVacant = (Fields[10].ToString() == "1" 
                ? true : false),
            D2018_TroughsDrinkingBowls = (Fields[11].ToString() == "1" 
                ? true : false),

            D2019_WaterServicesToCaravans = (Fields[12].ToString() == "1" 
                ? true : false),

            D2020_OutsideTaps = (Fields[13].ToString() == "1"
                 ? true : false),
            D2022_TransitionalArrangements = (Fields[14].ToString() == "1"
                 ? true : false),

            D2024_Unmeasurable = (Fields[15].ToString() == "1"
                 ? true : false),
            D2025_NotifyDisconnection_Reconnection = Fields[16].ToString(),
        };
        System.Diagnostics.Debug.WriteLine(i);

        Add(water);
        Save();
    }
}

1 个答案:

答案 0 :(得分:0)

有两个不同的想法。如果你真的想要使用EF,那么看看这个帖子:

Improving bulk insert performance in Entity framework

重要的是每次插入后都不要调用Save()。

但是,为了获得最佳性能,请不要将实体框架用于此任务。只需将所有内容放入DataTable,然后使用SQLBulkCopy类。这是它的工作类型。加载所有数据需要一两秒钟。