【问题标题】:SqlDataReader inside a loop in vb.NETvb.NET中循环内的SqlDataReader
【发布时间】:2017-06-01 19:47:28
【问题描述】:

我正在尝试插入/更新多记录并在表中更改后返回记录,我正在使用以下代码,

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 留在循环内,所有记录都会正确更新,但我会以 n x 2 的形式获取数据,如果我将其留在循环外,我会得到我的数据,但记录未正确更新/插入 请问有什么帮助吗?

【问题讨论】:

  • 这有点令人困惑,但我认为在您的循环中,您正在将插入的返回添加到循环中使用的同一集合中,从而复制您的数据。 ExecuteReader 是必要的吗?你不能使用 ExecuteNonQuery 吗?至少,您不应该将结果添加到循环使用的同一集合中。
  • @DennesTorres,是的,我需要阅读器,我之前正在执行 ExecuteNonQuery,但后来我需要填充一个列表,所以我使用了阅读器
  • 我不能使用循环来构建列表,我需要在数据插入时从服务器读取一些数据,,是否可以使用此示例解决它,因为我添加了一个新过程只是为了从循环函数中读取数据
  • 您的代码有问题。如果您需要填充一个列表,它可以是一个不同的列表吗?似乎您正在将新项目添加到您在循环中使用的同一列表中,尽管我对此不确定
  • 所以 Prtdata.Add(New PartnerData() ,,,, 中的“新”不会清理列表并从头开始添加?

标签: asp.net sql-server vb.net sqldatareader


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多