Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 试图找到通过两个表从.csv循环值的最快(成本最低)方法_C#_Mysql_Sql_Asp.net Mvc_Csv - Fatal编程技术网

C# 试图找到通过两个表从.csv循环值的最快(成本最低)方法

C# 试图找到通过两个表从.csv循环值的最快(成本最低)方法,c#,mysql,sql,asp.net-mvc,csv,C#,Mysql,Sql,Asp.net Mvc,Csv,我正在构建的应用程序允许用户上传一个.csv文件,该文件最终将填充ID匹配的现有SQL表的字段。首先,我使用LinqToCsv和foreach循环将.csv导入到临时表中。然后我有另一个foreach循环,它将临时表中的字段循环到ID匹配的现有表中。要使其一致且成功运行,唯一的方法是将第二个foreach循环嵌套在第一个循环中: [HttpPost] public ActionResult UploadValidationTable(HttpPostedFileBase

我正在构建的应用程序允许用户上传一个.csv文件,该文件最终将填充ID匹配的现有SQL表的字段。首先,我使用LinqToCsv和
foreach
循环将.csv导入到临时表中。然后我有另一个
foreach
循环,它将临时表中的字段循环到ID匹配的现有表中。要使其一致且成功运行,唯一的方法是将第二个foreach循环嵌套在第一个循环中:

        [HttpPost]
    public ActionResult UploadValidationTable(HttpPostedFileBase csvFile)
    {
        var inputFileDescription = new CsvFileDescription
        {
            SeparatorChar = ',',
            FirstLineHasColumnNames = true
        };
        var cc = new CsvContext();
        var filePath = uploadFile(csvFile.InputStream);
        var model = cc.Read<Credit>(filePath, inputFileDescription);

        try
        {
            var entity = new TestEntities();
            foreach (var item in model)
            {
                var tc = new TemporaryCsvUpload
                {
                    Id = item.Id,
                    CreditInvoiceAmount = item.CreditInvoiceAmount,
                    CreditInvoiceDate = item.CreditInvoiceDate,
                    CreditInvoiceNumber = item.CreditInvoiceNumber,
                    CreditDeniedDate = item.CreditDeniedDate,
                    CreditDeniedReasonId = item.CreditDeniedReasonId,
                    CreditDeniedNotes = item.CreditDeniedNotes
                };
                entity.TemporaryCsvUploads.Add(tc);

                var idMatches = entity.Authorizations.ToList().Where(x => x.Id == tc.Id);

                foreach (var number in idMatches)
                {
                    number.CreditInvoiceDate = tc.CreditInvoiceDate;
                    number.CreditInvoiceNumber = tc.CreditInvoiceNumber;
                    number.CreditInvoiceAmount = tc.CreditInvoiceAmount;
                    number.CreditDeniedDate = tc.CreditDeniedDate;
                    number.CreditDeniedReasonId = tc.CreditDeniedReasonId;
                    number.CreditDeniedNotes = tc.CreditDeniedNotes;
                }
            }
            entity.SaveChanges();
            entity.Database.ExecuteSqlCommand("TRUNCATE TABLE TemporaryCsvUpload");

            TempData["Success"] = "Updated Successfully";

        }
        catch (LINQtoCSVException)
        {
            TempData["Error"] = "Upload Error: Ensure you have the correct header fields and that the file is of .csv format.";
        }

        return View("Upload");
    }
[HttpPost]
public ActionResult UploadValidationTable(HttpPostedFileBase csvFile)
{
var inputFileDescription=新的CsvFileDescription
{
SeparatorChar=',',
FirstLineHasColumnNames=true
};
var cc=new CsvContext();
var filePath=uploadFile(csvFile.InputStream);
var model=cc.Read(文件路径,inputFileDescription);
尝试
{
var实体=新测试实体();
foreach(模型中的var项目)
{
var tc=新的临时CSVUPLOAD
{
Id=项目Id,
CreditInvoiceAmount=item.CreditInvoiceAmount,
CreditInvoiceDate=item.CreditInvoiceDate,
CreditInvoiceNumber=item.CreditInvoiceNumber,
CreditDeniedDate=项。CreditDeniedDate,
CreditDeniedReasonId=item.CreditDeniedReasonId,
CreditDeniedNotes=item.CreditDeniedNotes
};
entity.TemporaryCsvUploads.Add(tc);
var idMatches=entity.Authorizations.ToList(),其中(x=>x.Id==tc.Id);
foreach(idMatches中的变量编号)
{
number.CreditInvoiceDate=tc.CreditInvoiceDate;
number.CreditInvoiceNumber=tc.CreditInvoiceNumber;
number.CreditInvoiceAmount=tc.CreditInvoiceAmount;
number.CreditDeniedDate=tc.CreditDeniedDate;
number.CreditDeniedReasonId=tc.CreditDeniedReasonId;
number.CreditDeniedNotes=tc.CreditDeniedNotes;
}
}
entity.SaveChanges();
entity.Database.ExecuteSqlCommand(“TRUNCATE TABLE temporalycsvupload”);
TempData[“Success”]=“已成功更新”;
}
捕获(LINQtoCSVException)
{
TempData[“Error”]=“上载错误:请确保您有正确的头字段,并且文件为.csv格式。”;
}
返回视图(“上传”);
}
问题是速度。搜索一个包含7000个条目的SQL表、匹配ID并填写字段大约需要1分49秒

所以,我看了这个,认为第二个循环真的不需要嵌套。我把密码调高了,就像这样:

        [HttpPost]
    public ActionResult UploadValidationTable(HttpPostedFileBase csvFile)
    {
        var inputFileDescription = new CsvFileDescription
        {
            SeparatorChar = ',',
            FirstLineHasColumnNames = true
        };
        var cc = new CsvContext();
        var filePath = uploadFile(csvFile.InputStream);
        var model = cc.Read<Credit>(filePath, inputFileDescription);

        try
        {
            var entity = new TestEntities();
            var tc = new TemporaryCsvUpload();
            foreach (var item in model)
            {

                tc.Id = item.Id;
                tc.CreditInvoiceAmount = item.CreditInvoiceAmount;
                tc.CreditInvoiceDate = item.CreditInvoiceDate;
                tc.CreditInvoiceNumber = item.CreditInvoiceNumber;
                tc.CreditDeniedDate = item.CreditDeniedDate;
                tc.CreditDeniedReasonId = item.CreditDeniedReasonId;
                tc.CreditDeniedNotes = item.CreditDeniedNotes;
                entity.TemporaryCsvUploads.Add(tc);
            }

            var idMatches = entity.Authorizations.ToList().Where(x => x.Id == tc.Id);

            foreach (var number in idMatches)
            {
                number.CreditInvoiceDate = tc.CreditInvoiceDate;
                number.CreditInvoiceNumber = tc.CreditInvoiceNumber;
                number.CreditInvoiceAmount = tc.CreditInvoiceAmount;
                number.CreditDeniedDate = tc.CreditDeniedDate;
                number.CreditDeniedReasonId = tc.CreditDeniedReasonId;
                number.CreditDeniedNotes = tc.CreditDeniedNotes;
            }
            entity.SaveChanges();
            entity.Database.ExecuteSqlCommand("TRUNCATE TABLE TemporaryCsvUpload");

            TempData["Success"] = "Updated Successfully";

        }
        catch (LINQtoCSVException)
        {
            TempData["Error"] = "Upload Error: Ensure you have the correct header fields and that the file is of .csv format.";
        }

        return View("Upload");
    }
[HttpPost]
public ActionResult UploadValidationTable(HttpPostedFileBase csvFile)
{
var inputFileDescription=新的CsvFileDescription
{
SeparatorChar=',',
FirstLineHasColumnNames=true
};
var cc=new CsvContext();
var filePath=uploadFile(csvFile.InputStream);
var model=cc.Read(文件路径,inputFileDescription);
尝试
{
var实体=新测试实体();
var tc=新的临时csvupload();
foreach(模型中的var项目)
{
tc.Id=项目Id;
tc.CreditInvoiceAmount=item.CreditInvoiceAmount;
tc.CreditInvoiceDate=item.CreditInvoiceDate;
tc.CreditInvoiceNumber=item.CreditInvoiceNumber;
tc.CreditDeniedDate=item.CreditDeniedDate;
tc.CreditDeniedReasonId=item.CreditDeniedReasonId;
tc.CreditDeniedNotes=item.CreditDeniedNotes;
entity.TemporaryCsvUploads.Add(tc);
}
var idMatches=entity.Authorizations.ToList(),其中(x=>x.Id==tc.Id);
foreach(idMatches中的变量编号)
{
number.CreditInvoiceDate=tc.CreditInvoiceDate;
number.CreditInvoiceNumber=tc.CreditInvoiceNumber;
number.CreditInvoiceAmount=tc.CreditInvoiceAmount;
number.CreditDeniedDate=tc.CreditDeniedDate;
number.CreditDeniedReasonId=tc.CreditDeniedReasonId;
number.CreditDeniedNotes=tc.CreditDeniedNotes;
}
entity.SaveChanges();
entity.Database.ExecuteSqlCommand(“TRUNCATE TABLE temporalycsvupload”);
TempData[“Success”]=“已成功更新”;
}
捕获(LINQtoCSVException)
{
TempData[“Error”]=“上载错误:请确保您有正确的头字段,并且文件为.csv格式。”;
}
返回视图(“上传”);
}

这次只花了19秒就完成了。与第一个相比有了很大的改进。但当我检查数据库时,应该匹配的7行中只有一行被填写。有人能找出第二个代码块没有填充所有应该填充的行的原因吗?还是优化第一个块的更好方法?谢谢

第二个循环不起作用的原因是,您在第一个循环中设置了
tc
,但在循环之后定义了匹配项,即
var idMatches=entity.Authorizations.ToList()。其中(x=>x.Id==tc.Id)
,因此您只搜索第一个循环中最后一项的
Id
。就性能而言,我建议将整个CSV导入临时表,并运行update语句。关系数据库是为这种集合基操作而设计的。最快的方法可能是使用StreamReader和SqlBulkCopy,尽管较少使用ele