Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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# 快速加载大型数据Azure SQL_C#_Sql Server_Azure Sql Database - Fatal编程技术网

C# 快速加载大型数据Azure SQL

C# 快速加载大型数据Azure SQL,c#,sql-server,azure-sql-database,C#,Sql Server,Azure Sql Database,有一个问题。我每天都要更新和下载大量数据。大约140MB。这些数据取自该文件。这些长时间加载的9000条记录加载10分钟。尽管使用自定义sql server时数据加载速度更快 下面是我加载数据的代码: var InBase = FrmMain.allRecords.ToList(); var allcats = FrmMain.allCats; int curCategory = 0; for (int jrCnt = rCnt; jrCnt <= arrayTa

有一个问题。我每天都要更新和下载大量数据。大约140MB。这些数据取自该文件。这些长时间加载的9000条记录加载10分钟。尽管使用自定义sql server时数据加载速度更快

下面是我加载数据的代码:

var InBase = FrmMain.allRecords.ToList(); 
var allcats = FrmMain.allCats;
int curCategory = 0;
            for (int jrCnt = rCnt; jrCnt <= arrayTable.GetUpperBound(0); jrCnt++)
            {
                while (operations.Count(x => x.IsAlive) >= 100) ;

                var prcI = new Price();

                if (arrayTable[jrCnt, nametov] != null)
                    prcI.name = arrayTable[jrCnt, nametov].ToString();

                if (productsInBase.FirstOrDefault(x => x.name == prcI.name) != null) 
                {
                    var finded = productsInBase.FirstOrDefault(x => x.name == prcI.name && x.company==company);
                    prcI.ID = finded.ID;
                }

                if (arrayTable[jrCnt, pricetov] != null)
                {
                    decimal parsdec;
                    if (decimal.TryParse(arrayTable[jrCnt, pricetov].ToString(), out parsdec))
                        prcI.prc = parsdec;
                }

                prcI.category = curCategory;

                if (!string.IsNullOrEmpty(prcI.name) && prcI.prc == 0)
                {
                    var cat =
                        allcats.FirstOrDefault(
                            x =>
                            x.findname != "NaN" &&
                            x.findname.ToUpper().Split(';').Any(prcI.name.ToUpper().Contains));
                    curCategory = cat == null ? 0 : cat.id;
                }

                if ((string.IsNullOrEmpty(prcI.name)) || (prcI.prc == 0)) continue;

                Products.Add(prcI);

                if (count == 0 || count % 200 != 0 && jrCnt != arrayTable.GetUpperBound(0)) continue;

                int start = count >= prodInTh ? count % prodInTh != 0 ? (count - count % prodInTh) : (count - prodInTh) : 0;
                int end = count % prodInTh != 0 ? (count % prodInTh) : prodInTh;

                var productsForThreadUpd = Products.GetRange(start, end).Where(x => x.ID != 0).ToList();

                var addprod = Products.GetRange(start, end).Where(x => x.ID == 0).ToList();

                if (productsForThreadUpd.Count > 0) 
                {
                    var newTh = new Thread(() => _mainClass.AddProductsUpdateProduct(productsForThreadUpd))
                        {
                            Name = company + start + " - " + (start + end) + " UPDATE"
                        };

                    newTh.Start();
                    operations.Add(newTh);
                }
                if (addprod.Count > 0)
                {
                    var newTh = new Thread(() => _mainClass.AddProductsUpdateProduct(addprod))
                        {
                            Name = company + start + " - " + (start + end) + " ADD"
                        };

                    newTh.Start();
                    operations.Add(newTh);
                }

            }
var InBase=FrmMain.allRecords.ToList();
var allcats=FrmMain.allcats;
int curCategory=0;
对于(int jrCnt=rCnt;jrCnt x.IsAlive)>=100);
var prcI=新价格();
if(arrayTable[jrCnt,nametov]!=null)
prcI.name=arrayTable[jrCnt,nametov].ToString();
if(productsInBase.FirstOrDefault(x=>x.name==prcI.name)!=null)
{
var finded=productsInBase.FirstOrDefault(x=>x.name==prcI.name&&x.company==company);
prcI.ID=find.ID;
}
if(arrayTable[jrCnt,pricetov]!=null)
{
十进制小数;
if(decimal.TryParse(arrayTable[jrCnt,pricetov].ToString(),out-parsdec))
prcI.prc=parsdec;
}
prcI.category=curCategory;
如果(!string.IsNullOrEmpty(prcI.name)&&prcI.prc==0)
{
变种猫=
所有猫。第一个或默认值(
x=>
x、 findname!=“NaN”&&
x、 findname.ToUpper().Split(“;”).Any(prcI.name.ToUpper().Contains));
curCategory=cat==null?0:cat.id;
}
如果((string.IsNullOrEmpty(prcI.name))| |(prcI.prc==0))继续;
产品。添加(prcI);
如果(count==0 | | count%200!=0&&jrCnt!=arrayTable.GetUpperBound(0))继续;
整数开始=计数>=生产整数?计数%prodInTh!=0 ? (count-count%prodInTh):(count-prodInTh):0;
int end=计数%prodInTh!=0 ? (计数%prodInTh):prodInTh;
var productsForThreadUpd=Products.GetRange(开始,结束).Where(x=>x.ID!=0).ToList();
var addprod=Products.GetRange(start,end).Where(x=>x.ID==0.ToList();
如果(productsForThreadUpd.Count>0)
{
var newTh=新线程(()=>_mainClass.AddProductsUpdateProduct(productsForThreadUpd))
{
名称=公司+开始+“-”+(开始+结束)+“更新”
};
newTh.Start();
操作。添加(newTh);
}
如果(addprod.Count>0)
{
var newTh=新线程(()=>_mainClass.AddProductsUpdateProduct(addprod))
{
名称=公司+开始+“-”+(开始+结束)+“添加”
};
newTh.Start();
操作。添加(newTh);
}
}
我把负载分在两条线上。在obnom流中,我有200个条目。 启动代码数据:

public void AddProductsUpdateProduct(List<Price> price)
        {
            using (var dcupdateoradd = new PriceDataContext())
            {
                if (price.Any(x => x.ID != 0))
                {
                    var upds = price.Where(x => x.ID != 0).ToList();
                    dcupdateoradd.Price.AttachAll(upds);
                    dcupdateoradd.Refresh(RefreshMode.KeepCurrentValues, upds);
                }

                dcupdateoradd.Price.InsertAllOnSubmit(price.Where(x => x.ID == 0));

                dcupdateoradd.SubmitChanges();
            }
        }
public void AddProductsUpdateProduct(标价)
{
使用(var dcupdateoradd=new PriceDataContext())
{
if(price.Any(x=>x.ID!=0))
{
var upds=price.Where(x=>x.ID!=0.ToList();
dcupdateoradd.Price.附件(upds);
dcupdateoradd.Refresh(RefreshMode.KeepCurrentValues,upds);
}
dcupdateoradd.Price.InsertAllOnSubmit(Price.Where(x=>x.ID==0));
dcUpdateRadd.SubmitChanges();
}
}
不知道我还不喜欢多少次的程序连接到数据库的程序,但没有别的,直到你想出

内存上的负载:


谢谢大家!

有两种不同的方法可以将大量数据插入SQL数据库,我最喜欢的是SqlBulkCopy。此方法需要数据表,并将绕过实体框架。它允许您以非常高效的方式将记录流式传输到SQL数据库。我用它在WindowsAzure上每天向我的数据库中插入超过7000万行

您可以在以下博客中找到详细信息

另一种方法是使用存储过程并使用表值参数来使用INSERT INTO语句。在这种情况下,可以将DataTable作为参数传递给存储过程。确保DataTable与存储过程使用的用户定义类型100%匹配

您可以在下面的博客中找到有关使用此技术的详细信息


如果您正在寻找将9000多条记录插入数据库的方法,请确保使用SqlBulkCopy。存储过程方法实际上适用于小数据集。

我同意。ORM通常不适合尝试执行的批量操作。SqlBulkCopy是一块隐藏的宝石。您好!谢谢你的回复!您没有说明如何更新记录?将数据写入只写表,然后将数据合并到读表中。下面是一个合并示例,有关更多信息,请查看以下链接