2013-12-12 3 views
2

Я переношу программу vb6 на vb.net. по существу, нижняя функция создает набор классов. Я использую ключ как test_id для доступа к отдельным классам в коллекции в другом месте. единственная проблема, с которой я столкнулась, заключается в том, что свойство Sieves для класса обновляется с каждым последующим добавлением класса к коллекции. другими словами - когда я выполняю первый цикл/первый класс, я присваиваю sngSieveArray свойству класса (.sieves). все хорошо, а данные - именно то, что содержит db. во втором цикле - как только sngsievarray заполняется данными текущего класса - массив сита 1-го класса обновляется до этих же данных.Коллекция классов - свойство массива неправильно заполняется

всего - существует 3 класса - поэтому каждому .sieves присваивается массив сит последнего класса.

У меня полная потеря относительно того, как это пошло не так - все остальные свойства в классе сохраняются при создании каждого последующего класса.

Public Function GetSieveTestsInLot(mix_app_id As Long, mix_lot_id As Long, Optional,combinedMixLot As Long = 0, Optional combinedMixLot2 As Long = 0, Optional boolExclude As boolean = False) As Collection 
    On Error GoTo ErrorHandler 
    Dim strsql As String 
    Dim rsTests As SqlClient.SqlDataReader 
    Dim mycmd As SqlClient.SqlCommand 
    Dim mySieveTest As clsSieveTest 
    Dim sngSieveArray(0 To 12) As Single 

    Dim theConn As SqlClient.SqlConnection = New SqlClient.SqlConnection(My.Settings.AsphaltConnectionString) 
    If Not (theConn.State = ConnectionState.Open) Then 
     theConn.Open() 
    End If 

    strsql = "select mix_lot.MIX_LOT_ID,LOT_NUMBER, EXCLUDED,SAMPLE_TEST_ID, mix_lot.MIX_APPLICATION_ID, p.* from " _ 
     & "(select TEST_PERCENT_PASSING.PER_PASSING, TEST_PERCENT_PASSING.SIEVE_ID, TEST_PERCENT_PASSING.TEST_ID from TEST_PERCENT_PASSING) as t " _ 
     & "pivot (min(per_passing) for Sieve_id in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13])) p inner join TEST_DATA_CALC on TEST_DATA_CALC.TEST_ID = p.TEST_ID " _ 
     & "inner join MIX_LOT on MIX_LOT.MIX_LOT_ID = TEST_DATA_CALC.MIX_LOT_ID where MIX_APPLICATION_ID = " & mix_app_id & " And (MIX_LOT.mix_lot_id = " & mix_lot_id & " or mix_lot.mix_lot_id = " & combinedMixLot _ 
    & " or mix_lot.mix_lot_id = " & combinedMixLot2 & ")" 



    mycmd = New SqlClient.SqlCommand 
    mycmd.CommandText = strsql 
    mycmd.CommandType = CommandType.Text 
    mycmd.Connection = theConn 

    rsTests = mycmd.ExecuteReader 

    GetSieveTestsInLot = New Collection 
    If rsTests.HasRows Then 
     Do While rsTests.Read 
      If Not (boolExclude = True And rsTests!excluded = True) Then 
       mySieveTest = New clsSieveTest 
       With mySieveTest 
        .test_id = rsTests!test_id 
        .mix_lot_id = rsTests!mix_lot_id 
        .lot_number = rsTests!lot_number 
        .mix_app_id = mix_app_id 
        .sample_test_id = rsTests!sample_test_id 
        .test_exlcuded = rsTests!excluded 

        For i = 0 To 12 
         For j = 0 To rsTests.FieldCount - 1 
          ' MsgBox(rsTests.GetName(j).ToString) 
          If rsTests.GetName(j).ToString = (i + 1).ToString Then 
           ' MsgBox(rsTests.Item(j).ToString) 
           sngSieveArray(i) = rsTests.Item(j) 
          End If 
         Next j 
        Next i 

        .sieves = sngSieveArray 
       End With 

       GetSieveTestsInLot.Add(mySieveTest, CStr(mySieveTest.test_id)) 
      End If 

     Loop 
     rsTests.Close() 
    End If 

    rsTests = Nothing 
    mycmd = Nothing 
    theConn.Close() 
    theConn = Nothing 
    Exit Function 

ErrorHandler: 
    MsgBox("An error has occured in GetSieveTestsInLot in clsSieveTest with Error number: " & Err.Number & " defined as" & vbCrLf _ 
    & Err.Description, vbCritical, "Program Failure") 
    rsTests = Nothing 
    mycmd = Nothing 
    theConn.Close() 
    theConn = Nothing 
End Function 

MIX_LOT_ID LOT_NUMBER ИСКЛЮЧЕНЫ SAMPLE_TEST_ID MIX_APPLICATION_ID TEST_ID 1 2 3 4 5 6 7 8 9 10 11 12 13


141 1 0 1 36 430 5,15 100 100 100 90,7 76,3 49,6 35,3 24,8 17,7 13,1 8.5 5.5 141 1 0 2 36 431 5,35 100 100 100 91,2 78,5 48,6 35,4 25 18,6 13,4 8 4,9 141 1 0 3 36 432 5,16 100 100 98,8 84,8 74,1 53,8 38,4 26,8 19 13,7 9,1 5,2

(3 ряда (-ых) затронутых)

ответ

0

Причина в том, что массивы являются ссылочными типами. Свойство .sieves каждого экземпляра вашего clsSieveTest ссылается на один и тот же экземпляр массива. Вам нужно переместить объявление sngSieveArray внутри вашего цикла Do While, чтобы каждый новый экземпляр вашего clsSieveTest получил свой собственный массив.

+0

chris - спасибо! просто переместил оператор dim в цикл do, и, как вы сказали, теперь работает отлично. просто так, чтобы я мог понять, почему ... этот код был идентичен в vb6 - почему массив не нужно создавать таким образом в этой старой версии vb? просто думая, что причина может быть полезной для других конверсионных когтей ... независимо - спасибо за soln. – user3093316

Смежные вопросы