2017-06-01 53 views
0
一個循環內

餘米試圖插入/更新多條記錄,並在表變更後返回記錄而我會用下面的代碼,SqlDataReader的在vb.NET

Using cmd As New SqlCommand("TblRegJoinDynHdlr", con) 
    cmd.CommandType = CommandType.StoredProcedure 
    Dim Data = PtRegData(0).PartnerData 
    For i As Integer = 0 To Data.Count - 1 
     cmd.Parameters.Clear() 
     If (String.IsNullOrEmpty(Data(i).RecID)) Then 
      cmd.Parameters.Add("@RecID", SqlDbType.Int).Value = DBNull.Value 
     Else 
      cmd.Parameters.Add("@RecID", SqlDbType.Int).Value = Convert.ToInt32(Data(i).RecID) 
     End If 
     If (String.IsNullOrEmpty(Data(i).PtFilenum)) Then 
      cmd.Parameters.Add("@ptfilenum", SqlDbType.Int).Value = DBNull.Value 
     Else 
      cmd.Parameters.Add("@ptfilenum", SqlDbType.Int).Value = Convert.ToInt32(Data(i).PtFilenum) 
     End If 
     If (String.IsNullOrEmpty(Data(i).PrtFilenum)) Then 
      cmd.Parameters.Add("@prfilenum", SqlDbType.Int).Value = DBNull.Value 
     Else 
      cmd.Parameters.Add("@prfilenum", SqlDbType.Int).Value = Convert.ToInt32(Data(i).PrtFilenum) 
     End If 
     cmd.Parameters.Add("@PrtStatus", SqlDbType.Int).Value = (Data(i).PrtStatus) 
     con.Open() 
     Using sdr As SqlDataReader = cmd.ExecuteReader() 
      While sdr.Read() 
       Prtdata.Add(New PartnerData() With { _ 
       .RecID = sdr("RecID").ToString(), _ 
       .PrtFilenum = sdr("PrtFilenum").ToString(), _ 
       .PtFilenum = sdr("PtFilenum").ToString(), _ 
       .FullName = sdr("FullName").ToString(), _ 
       .PrtStatus = sdr("PrtStatus").ToString(), _ 
       .DOB = sdr("DOB").ToString() _ 
       }) 
      End While 
     End Using 
     con.Close() 
    Next 

    con.Dispose() 
End Using 

我的問題 如果我離開循環內SqlDataReader中,所有記錄都正確更新,但我得到的數據作爲NX 2,如果我離開它的循環,我得到不更新我的數據,但記錄外/插入正確 任何幫助嗎?

+0

這是一個有點混亂,但我覺得你的循環內您要添加的回報插入到循環中使用的相同集合中,複製數據。 ExecuteReader是必要的嗎?你不能使用ExecuteNonQuery嗎?至少,您不應將結果添加到循環使用的相同集合中。 –

+0

@DennesTorres,是的,我需要的讀者,我在做的ExecuteNonQuery之前,但後來我需要填充列表,所以我用一個讀者 – JSON

+0

我不能使用循環建立的名單,我需要從對數據服務器讀取一些數據插入,,,是有可能解決它與這個例子,因爲我添加一個新的程序只是讀取數據分開形成循環功能 – JSON

回答

-1

關閉您的連接關閉你的讀者之前,也就是纔去下一輪說你必須關閉你的讀者

Using cmd As New SqlCommand("TblRegJoinDynHdlr", con) 
     cmd.CommandType = CommandType.StoredProcedure 
     Dim Data = PtRegData(0).PartnerData 
     For i As Integer = 0 To Data.Count - 1 
      cmd.Parameters.Clear() 
      If (String.IsNullOrEmpty(Data(i).RecID)) Then 
       cmd.Parameters.Add("@RecID", SqlDbType.Int).Value = DBNull.Value 
      Else 
       cmd.Parameters.Add("@RecID", SqlDbType.Int).Value = Convert.ToInt32(Data(i).RecID) 
      End If 
      If (String.IsNullOrEmpty(Data(i).PtFilenum)) Then 
       cmd.Parameters.Add("@ptfilenum", SqlDbType.Int).Value = DBNull.Value 
      Else 
       cmd.Parameters.Add("@ptfilenum", SqlDbType.Int).Value = Convert.ToInt32(Data(i).PtFilenum) 
      End If 
      If (String.IsNullOrEmpty(Data(i).PrtFilenum)) Then 
       cmd.Parameters.Add("@prfilenum", SqlDbType.Int).Value = DBNull.Value 
      Else 
       cmd.Parameters.Add("@prfilenum", SqlDbType.Int).Value = Convert.ToInt32(Data(i).PrtFilenum) 
      End If 
      cmd.Parameters.Add("@PrtStatus", SqlDbType.Int).Value = (Data(i).PrtStatus) 
      con.Open() 
      Using sdr As SqlDataReader = cmd.ExecuteReader() 
       While sdr.Read() 
        Prtdata.Add(New PartnerData() With { _ 
        .RecID = sdr("RecID").ToString(), _ 
        .PrtFilenum = sdr("PrtFilenum").ToString(), _ 
        .PtFilenum = sdr("PtFilenum").ToString(), _ 
        .FullName = sdr("FullName").ToString(), _ 
        .PrtStatus = sdr("PrtStatus").ToString(), _ 
        .DOB = sdr("DOB").ToString() _ 
        }) 
       End While 
      End Using 
    sdr.close() 'This code added 
      con.Close() 
     Next 

    con.Dispose() 
End Using 
+2

當使用 '使用',它已經關閉 –