2013-04-05 36 views
0

我想要做的是创建一个方法使用WCF服务来通过一个数据库(事务)抓住一切从今天拥有的表日期,然后将它们添加到我的每天的销售表,该表将有每个日期显示的利润,日常征收,费用一排等试图更新SQL数据库中的单行使用LINQ to SQL使用WCF服务

我一直试图做这样的

 public void CalculateProfit(string Date) 
     { 

      decimal takings = 0;// not needed 
      decimal Expenses = 0;// not needed 
      using (transactionClassDataContext cont = new transactionClassDataContext()) 
      { 
       int counter = 0; 
       DailySale d = new DailySale(); 
       var query = (from q in cont.DailySales where q.Date.Equals(Date) select q); 
       var query2 = (from r in cont.Transactions where r.Date.Equals(Date) select r); 
       foreach (var z in query) 
       { 
        counter++; 

       } 
       if (counter>0) 
       { 

         foreach (var y in query2) 
         { 

          takings = takings + y.Price; 
          Expenses = Expenses + 0; 

          d.Expenses += 0; 
          d.Takings += y.Price; 
          d.Profit = d.Takings - d.Expenses; 
          d.Date = Date; 

          cont.DailySales.InsertOnSubmit(d);// update the value 
          cont.SubmitChanges(); 

         }    
       } 
       else 
       { 

        d.Date = Date; 
        cont.DailySales.InsertOnSubmit(d);// if there isnt an entry for todays date, add one 
        cont.SubmitChanges(); 
       } 

      } 

     } 


    } 
} 

但它所做的只是抛出这个错误“无法添加已存在的实体。”

大多数类似的问题都说我需要在foreach中创建一个新的d实例,但似乎要做的就是在m日销售中添加大量记录,当我想要的只是一行更新总数。

任何想法?

回答

0

它原来我改变d(每天的销售台),而不是改变“变种R”

  DailySale d = new DailySale(); 
      var query = (from q in cont.DailySales where q.Date.Equals(Date) select q); 


      foreach (var z in query) 
      { 
       counter++; 
      } 


      if (counter>0) 
      { 
       foreach (var r in query) 
       { 

        r.Takings = r.Takings + (decimal)price; // here i was using d instead of r 
        r.Profit = r.Takings - r.Expenses; 
       } 
       cont.SubmitChanges(); 

感谢您的帮助。

1

您应该将DailySale d = new DailySale();移到使用它的范围内。

+0

如果您阅读了这个问题,您可能会注意到您的答案无法解决我的问题。 – 2013-04-05 14:19:17

0

您正在为foreach语句中的每个回合添加相同的对象。

1)可以移动该线的foreach以外:

    cont.DailySales.InsertOnSubmit(d);// update the value 
        cont.SubmitChanges(); 

2)插入在第一圈的对象。在后续轮回中更新同一个对象。

    cont.UpdateObject(d); 
        cont.SaveChanges(); 
+0

UpdateObject不是一个选项,它不会弹出...任何建议? – 2013-04-05 14:00:31

0

你应该只插入一次

using (transactionClassDataContext cont = new transactionClassDataContext()) 
      { 
       int counter = 0; 
       DailySale d = new DailySale(); 
       cont.DailySales.InsertOnSubmit(d);// **INSERT** the value 

而且更新时间

  var query = (from q in cont.DailySales where q.Date.Equals(Date) select q); 
      var query2 = (from r in cont.Transactions where r.Date.Equals(Date) select r); 
      foreach (var z in query) 
      { 
       counter++; 

      } 
      if (counter>0) 
      { 

        foreach (var y in query2) 
        { 

         takings = takings + y.Price; 
         Expenses = Expenses + 0; 

         d.Expenses += 0; 
         d.Takings += y.Price; 
         d.Profit = d.Takings - d.Expenses; 
         d.Date = Date; 


         cont.SubmitChanges(); // *** left it here but better move it outside the foreach, 

        }    

的`cont.SubmitChanges的其余部分();甚至可以完全移动到最后,所以你只有一个事务。