Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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# 全部插入仅插入最后一条记录?解决并发冲突_C#_Sql Server_Linq_Linq To Sql - Fatal编程技术网

C# 全部插入仅插入最后一条记录?解决并发冲突

C# 全部插入仅插入最后一条记录?解决并发冲突,c#,sql-server,linq,linq-to-sql,C#,Sql Server,Linq,Linq To Sql,不管我怎么努力,我都不能让它工作 这是一个类似的问题,在我的例子中,它只插入最后一个记录集 起初,我认为它是主键,但没有使用DateTime.UtcNow.Ticks更新ID列将其设置为手动设置。但是在更改了SQLServer中的设置后,我能够手动设置主键 我原以为这样可以解决问题,但现在它更新主键,但只在foreach循环中插入最后一条记录 我尝试删除Dbml并重新创建它,但没有任何效果 这是我正在使用的代码 List<Tenant_Bills_TBL> addNewData =

不管我怎么努力,我都不能让它工作

这是一个类似的问题,在我的例子中,它只插入最后一个记录集

起初,我认为它是主键,但没有使用
DateTime.UtcNow.Ticks
更新
ID
列将其设置为手动设置。但是在更改了SQLServer中的设置后,我能够手动设置主键

我原以为这样可以解决问题,但现在它更新主键,但只在
foreach
循环中插入最后一条记录

我尝试删除
Dbml
并重新创建它,但没有任何效果

这是我正在使用的代码

List<Tenant_Bills_TBL> addNewData = new List<Tenant_Bills_TBL>();
       Tenant_Bills_TBL addBill = new Tenant_Bills_TBL();
       var recordsForTenant = Database.GetBillsRecordsForTenant(Database.DataContext, SelectedTenant.Code);
       foreach (var item in recordsForTenant)
          {
              addBill.ID = DateTime.UtcNow.Ticks;
              addBill.Tenant_Code = SelectedTenant.Code;
              addBill.Year_Data = DateFilter.Year;
              addBill.Month_Data = DateFilter.Month;
              addBill.Tenant_Bill = item.Tenant_Bill;
              addBill.Bill_Amount = item.Bill_Amount;
              addBill.Bill_Quantity = item.Bill_Quantity;                            
              addNewData.Add(addBill);                            
          }
 Database.DataContext.Tenant_Bills_TBLs.InsertAllOnSubmit(addNewData);
 Database.DataContext.SubmitChanges(); 
List addNewData=newlist();
承租人账单addBill=新承租人账单;
var recordsForTenant=Database.GetBillsRecordsForTenant(Database.DataContext,SelectedTenant.Code);
foreach(RecordsForEnablent中的var项)
{
addBill.ID=DateTime.UtcNow.Ticks;
addBill.Tenant\u Code=所选的Tenant.Code;
addBill.Year_Data=DateFilter.Year;
addBill.Month_Data=DateFilter.Month;
addBill.Tenant\u Bill=item.Tenant\u Bill;
addBill.Bill\u Amount=item.Bill\u Amount;
addBill.Bill\u数量=item.Bill\u数量;
addNewData.Add(addBill);
}
Database.DataContext.Tenant\u Bills\u TBLs.InsertAllOnSubmit(addNewData);
Database.DataContext.SubmitChanges();
这就像列表在添加后覆盖了值,只保留了
列表中的最后一个数据集


服务器端是否有需要更改的设置,或者是其他设置?

您之所以会出现这种行为,是因为您反复添加了相同的对象。正如评论所说的,您应该在循环中移动新对象的实例化。 更妙的是,您可以将其作为LINQ声明:

var newData = Database
           .GetBillsRecordsForTenant(Database.DataContext, SelectedTenant.Code)
           .Select(item => new Tenant_Bills_TBL{
                ID = DateTime.UtcNow.Ticks;
                Tenant_Code = SelectedTenant.Code;
                Year_Data = DateFilter.Year;
                Month_Data = DateFilter.Month;
                Tenant_Bill = item.Tenant_Bill;
                Bill_Amount = item.Bill_Amount;
                Bill_Quantity = item.Bill_Quantity;                                          
                })
           .ToList();
    Database.DataContext.Tenant_Bills_TBLs.InsertAllOnSubmit(addNewData);

您之所以会出现这种行为,是因为您一次又一次地添加了相同的对象。正如评论所说的,您应该在循环中移动新对象的实例化。 更妙的是,您可以将其作为LINQ声明:

var newData = Database
           .GetBillsRecordsForTenant(Database.DataContext, SelectedTenant.Code)
           .Select(item => new Tenant_Bills_TBL{
                ID = DateTime.UtcNow.Ticks;
                Tenant_Code = SelectedTenant.Code;
                Year_Data = DateFilter.Year;
                Month_Data = DateFilter.Month;
                Tenant_Bill = item.Tenant_Bill;
                Bill_Amount = item.Bill_Amount;
                Bill_Quantity = item.Bill_Quantity;                                          
                })
           .ToList();
    Database.DataContext.Tenant_Bills_TBLs.InsertAllOnSubmit(addNewData);
争吵

Tenant_Bills_TBL addBill = new Tenant_Bills_TBL(); 
应该在foreach循环中

问题中的代码实例化单个对象,并在每次迭代中重写其属性

另外,不建议将
DateTime.UtcNow.Ticks
作为主键。最好使用数据库自动增量内置机制(大多数数据库都有该选项)。正如您自己发现的那样,foreach循环太快了,在每次迭代之间都无法改变刻度,如果您甚至想到多线程插入,您可以清楚地看到,即使在循环中使用Thread.Sleep也不够好。

Tenant_Bills_TBL addBill = new Tenant_Bills_TBL(); 
应该在foreach循环中

问题中的代码实例化单个对象,并在每次迭代中重写其属性


另外,不建议将
DateTime.UtcNow.Ticks
作为主键。最好使用数据库自动增量内置机制(大多数数据库都有该选项)。正如您自己所发现的,foreach循环太快,在每次迭代之间都无法改变刻度,如果您甚至想到多线程插入,您可以清楚地看到,即使有Thread.Sleep在循环中也不够好。

此行
Tenant\u Bills\u TBL addBill=new Tenant\u Bills\u TBL()
应该在
foreach
循环中。@ZoharPeled谢谢,这就成功了。如果你想让它成为一个答案,我将紫外线和马克解决。干杯顺便说一句,我需要在
foreach
移动到fast并创建相同的主键值时增加日期时间刻度。此行
Tenant\u Bills\u TBL addBill=new Tenant\u Bills\u TBL()
应该在
foreach
循环中。@ZoharPeled谢谢,这就成功了。如果你想让它成为一个答案,我将紫外线和马克解决。干杯顺便说一句,我需要在
foreach
移动到fast并创建相同的主键值时增加日期时间刻度。我真不敢相信有时我会如此愚蠢。再次感谢。忽略简单的错误不会让人愚蠢。有时候我们都会这样。我真不敢相信有时候我会有多傻。再次感谢。忽略简单的错误不会让人愚蠢。我们有时都这样做。