【问题标题】:Returning Wrong Details after IDataReader = DbObject.ExecuteReader(DbCommand) 2nd time executionIDataReader = DbObject.ExecuteReader(DbCommand) 第二次执行后返回错误的详细信息
【发布时间】:2015-10-20 10:23:16
【问题描述】:

我对这段代码有点困惑,我不知道我在做什么,

Public Function CreateAddressDetailDb(ByVal AddressDetailList As IList(Of AddressDetail), ByVal EmployeeID As Integer) As String

    Dim ReturnCode As Boolean = False
    Dim Employeegeneratednumber As String = String.Empty
    Dim ReturnValues As New Dictionary(Of String, Object)
    Dim DbObject As Database = DatabaseFactory.CreateDatabase()
    Dim DbCommand As DbCommand = DbObject.GetStoredProcCommand("usp_AddressDetial_Create")

    Try
        If Not AddressDetailList Is Nothing And AddressDetailList.Count > 0 Then
            For Each Addressdetaulobject As AddressDetail In AddressDetailList
                With Addressdetaulobject
                    Data.AddInParameter(DbCommand, "paEmployeeID", DbType.Int32, EmployeeID, DbObject)
                    Data.AddInParameter(DbCommand, "paUpdatedBy", DbType.Int16, .Updatedby, DbObject)
                End With

                Using DataReaderObject As IDataReader = DbObject.ExecuteReader(DbCommand)

                    DataReaderObject.Read()
                    ReturnValues("Result") = DataReaderObject.Item("Result")
                    ReturnValues("Employeenumber") = DataReaderObject.Item("Employeenumber")
                    DataReaderObject.Close()
                    If Employeegeneratednumber = String.Empty Or Employeegeneratednumber = "" Then
                        Employeegeneratednumber = CType(ReturnValues("Employeenumber"), String)
                    End If
                End Using
                DbCommand.Parameters.Clear()
            Next
        End If
        If ReturnValues("Result").ToString().Equals("0") Then
            Return Employeegeneratednumber
        Else
            Return String.Empty
        End If
    Catch ex As System.Exception
        Throw
    End Try
    Return Employeegeneratednumber
End Function

当我插入带有 1 个地址的 Employee 时,Employeegeneratednumber 是正确的,但如果插入带有 2 个地址的 Employee,那么我会得到与当前员工无关的旧 Employeegeneratednumber这个问题只发生在生产站点而不是开发站点

【问题讨论】:

    标签: vb.net visual-studio-2012 sql-server-2012


    【解决方案1】:

    SqlDataReader 提供了一种从 SQL Server 数据库中读取只进的行流的方法。

    您的电话 DataReaderObject.Read() 将仅返回第一行,而您必须循环访问可用的行,如下所示:

    while (DataReaderObject.Read())
    {
         ReturnValues("Result") = DataReaderObject.Item("Result")
         ReturnValues("Employeenumber") = DataReaderObject.Item("Employeenumber")
    }
    

    您可能需要根据您的要求更改逻辑,因为当您访问ReturnValues("Employeenumber") 时,上述代码将始终返回可用行的最后一行的Employeenumber

    【讨论】:

    • 当我尝试插入地址 1 然后得到员工编号 = 10 并且当我尝试为同一员工插入地址 2 时,我得到错误的员工编号。我在这里传递同一员工的地址列表
    猜你喜欢
    • 2019-10-12
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多