C# 如何加快sql创建过程

C# 如何加快sql创建过程,c#,sql,entity-framework,C#,Sql,Entity Framework,在我的应用程序中,我为sql表创建行 int findNewId = Entities.myTable.Where(a => a.Name == txtName.Text).Select(b => b.Id).FirstOrDefault(); for (int i = 0; i < incomingDtbl.Rows.Count; i++) { addNew.Id = findNewId; addNew.Date = Convert.ToDateTime(i

在我的应用程序中,我为sql表创建行

int findNewId = Entities.myTable.Where(a => a.Name == txtName.Text).Select(b => b.Id).FirstOrDefault();

for (int i = 0; i < incomingDtbl.Rows.Count; i++)
{
    addNew.Id = findNewId;
    addNew.Date = Convert.ToDateTime(incomingDtbl.Rows[i].ItemArray[2]);
    addNew.Hour = Convert.ToInt32(incomingDtbl.Rows[i].ItemArray[3]);
    ...
    addNew.CreationDate = System.DateTime.Now;
    Entities.myTable.Add(addNew);
    Entities.SaveChanges();

}
int findNewId=Entities.myTable.Where(a=>a.Name==txtName.Text)。选择(b=>b.Id.FirstOrDefault();
对于(int i=0;i
但是我的incomingDtbl大约有130000行,所以需要很长时间。 有没有办法加快这一进程


我不能直接批量复制incomingDtbl,因为它没有新ID。

我也遇到过类似的问题(我的是170000行)。以下是我的解决方案:

public bool InsertData(列表机器信息、字符串标志、int userID)
{
if(MachineInfo!=null&&flag!=string.Empty)
{
List attList=新列表();
foreach(机器信息中的变量项)
{
T att=新的T()
{
CreatedDate=DateTime。现在,
DateTime=item.DateTimeRecord,
EnrollNumber=item.EnrollNumber.ToString(),
IPFlag=标志,
SyncBy=userID
};
附件列表。添加(附件);
}
尝试
{
实体上下文=空;
尝试
{
上下文=新实体();
context.Configuration.AutoDetectChangesEnabled=false;
整数计数=0;
foreach(attList中的var实体)
{
++计数;
context=AddToContext(context,entity,count,100,true);
}
SaveChanges();
}
最后
{
if(上下文!=null)
context.Dispose();
}
返回true;
}
捕获(例外情况除外)
{
返回false;
}
}
返回false;
}
私有实体AddToContext(实体上下文、T实体、int计数、int提交计数、bool重新创建上下文)
{
context.Set().Add(实体);
如果(计数%commitCount==0)
{
SaveChanges();
如果(重新创建上下文)
{
context.Dispose();
上下文=新实体();
context.Configuration.AutoDetectChangesEnabled=false;
}
}
返回上下文;
}
它的执行速度非常快,因为它可以分割记录并帮助您进行验证


祝你一切顺利

我也遇到过类似的问题(我的是170000行)。以下是我的解决方案:

public bool InsertData(列表机器信息、字符串标志、int userID)
{
if(MachineInfo!=null&&flag!=string.Empty)
{
List attList=新列表();
foreach(机器信息中的变量项)
{
T att=新的T()
{
CreatedDate=DateTime。现在,
DateTime=item.DateTimeRecord,
EnrollNumber=item.EnrollNumber.ToString(),
IPFlag=标志,
SyncBy=userID
};
附件列表。添加(附件);
}
尝试
{
实体上下文=空;
尝试
{
上下文=新实体();
context.Configuration.AutoDetectChangesEnabled=false;
整数计数=0;
foreach(attList中的var实体)
{
++计数;
context=AddToContext(context,entity,count,100,true);
}
SaveChanges();
}
最后
{
if(上下文!=null)
context.Dispose();
}
返回true;
}
捕获(例外情况除外)
{
返回false;
}
}
返回false;
}
私有实体AddToContext(实体上下文、T实体、int计数、int提交计数、bool重新创建上下文)
{
context.Set().Add(实体);
如果(计数%commitCount==0)
{
SaveChanges();
如果(重新创建上下文)
{
context.Dispose();
上下文=新实体();
context.Configuration.AutoDetectChangesEnabled=false;
}
}
返回上下文;
}
它的执行速度非常快,因为它可以分割记录并帮助您进行验证


祝你一切顺利

不执行
实体。保存更改()将更改持久化到数据库?若有,;您可以尝试在每行100行之后调用它,而不是每行一行>代码>,因为它一般没有NeWID,请考虑让数据库决定新的技术键,而不是您的软件。数据库在这方面做得很好,而且它为您节省了很多麻烦。@oerkelens我的目的地tbl有如下列:logId、newId、date、hour。。。。所以我需要新ID。您可以临时禁用
验证
更改跟踪
。并取出
Entities.SaveChanges()循环外。它将提高性能<代码>Entities.Configuration.AutoDetectChangesEnabled=false
Entities.Configuration.ValidateOnSaveEnabled=false