2017-06-01 29 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

当使用 '使用',它已经关闭 –