none
LINQ to SQL 跑迴圈新增,結果只新增了最後一筆 RRS feed

  • 問題

  • 因為作刪除時itno會跳號,所以要重新編號,但是它是PK 不許修改,只能刪掉再重新新增,
    然後我跑迴圈去新增,跑完後只新增了最後一筆,如果直接 db.零用金報銷明細B.InsertaAllOnSubmit(Lst)
    又說不能新增已存在的實體,怎麼辦呢?請幫幫忙!



      Dim chorder = From dd In db.零用金報銷明細B Where dd.PETTYNO = DropDownList3.SelectedValue.Trim And dd.ITNO > _itno Order By dd.ITNO Select dd
           
    Dim Lst As List(Of 零用金報銷明細B) = chorder.ToList

            Dim i As Integer = 1
            For Each cod In chorder
                db.零用金報銷明細B.DeleteOnSubmit(cod)
            Next
            db.SubmitChanges()

            i = _itno
            For Each _lst In Lst
                Dim ptb As New 零用金報銷明細B
                ptb.PETTYNO = _lst.PETTYNO
                ptb.ITNO = i
                ptb.PDATE = _lst.PDATE
                ptb.BNO1 = _lst.BNO1
                ptb.DESCRIPT = _lst.DESCRIPT
                ptb.AMOUNT = _lst.AMOUNT
                ptb.MODATE = Now
                ptb.MOUSER = Application("UserNum")
                ptb.PROOF = _lst.PROOF

                db.零用金報銷明細B.InsertOnSubmit(ptb)
                db.SubmitChanges()
                i += 1
            Next

    2009年10月19日 上午 10:18

解答

  • 問題可能在這裡:

    For Each _lst In Lst
                Dim ptb As New 零用金報銷明細B
                ptb.PETTYNO = _lst.PETTYNO
                ptb.ITNO = i
                ptb.PDATE = _lst.PDATE
                ptb.BNO1 = _lst.BNO1
                ptb.DESCRIPT = _lst.DESCRIPT
                ptb.AMOUNT = _lst.AMOUNT
                ptb.MODATE = Now
                ptb.MOUSER = Application("UserNum")
                ptb.PROOF = _lst.PROOF

                db.零用金報銷明細B.InsertOnSubmit(ptb)
              
                i += 1
            Next

    db.SubmitChanges()

    微軟技術支援中心 (CSS)
    2009年10月20日 上午 01:44

所有回覆

  • 問題可能在這裡:

    For Each _lst In Lst
                Dim ptb As New 零用金報銷明細B
                ptb.PETTYNO = _lst.PETTYNO
                ptb.ITNO = i
                ptb.PDATE = _lst.PDATE
                ptb.BNO1 = _lst.BNO1
                ptb.DESCRIPT = _lst.DESCRIPT
                ptb.AMOUNT = _lst.AMOUNT
                ptb.MODATE = Now
                ptb.MOUSER = Application("UserNum")
                ptb.PROOF = _lst.PROOF

                db.零用金報銷明細B.InsertOnSubmit(ptb)
              
                i += 1
            Next

    db.SubmitChanges()

    微軟技術支援中心 (CSS)
    2009年10月20日 上午 01:44
  • 謝謝Lolota Lee

    不過我本來就是把db.SubmitChanges() 放在 For  next 外面,結果是新增一筆後,
    後續的資料會覆蓋這一筆,不會再新增(我用偵錯看到的)
    所以我就想我每一筆就submit一次總會新增了吧,
    結果還是一樣最後跑完迴圈只有最後一筆,其他的都不見了
    • 已編輯 xx3857 2009年10月20日 上午 05:40
    2009年10月20日 上午 03:47
  • Hi,

    您放在外面時, 有實際看到最後的結果嗎?
    因為我測試是可行的.


    Lolota

    微軟技術支援中心 (CSS)
    • 已標示為解答 xx3857 2009年10月20日 上午 06:51
    • 已取消標示為解答 小朱MVP, Moderator 2009年10月20日 上午 07:05
    2009年10月20日 上午 04:14
  • 我放裡面去測試也是可行的........
    2009年10月20日 上午 05:04
  • 有看到結果,到資料庫去看結果就是只有一筆,不管放在裡面或外面。
    怎麼會這樣?我有那裡沒注意到嗎?


    >您放在外面時, 有實際看到最後的結果嗎?
    >因為我測試是可行的.
    2009年10月20日 上午 05:52
  • Hi,


    先確認一下下列狀況:

    1. Lst.Count 數量是不是大於1?
    2. 分兩段測試, 先執行刪除的測試, 然後再執行新增測試.



    Lolota


    微軟技術支援中心 (CSS)
    2009年10月20日 上午 05:59
  • 檢查dbml中的主索引到底是不是itno
    2009年10月20日 上午 06:19
  • 我找到原因了!
    我一共有4列,刪除第二列,然後要把3、4列重編序號,我的LinqDataSource 有開啟自動刪除功能,
    可是我在ListView 的 ItemDeleteing 又做了一次刪除的動作,所以最後就只剩第4列跟第一列了
    是我的錯,如果我測試資料有5列就會發現最後剩下的是1、4、5列。
    現在把那段重新編號的程式搬到 ItemDeleted 去,一切正常了。
    謝謝兩位幫忙。
    2009年10月20日 上午 06:59