2015-04-24 7 views
0

Вот мой основной метод тест, ошибка происходит на линиине удается получить данные в строке данных

target.DeletePHIParmYield (rowToDelete);

[TestMethod()] 
    public void DeletePHIParmYieldTest() 
    { 
     CommonPHIEditorBL_Accessor target = new CommonPHIEditorBL_Accessor(); 
     target.mCommonPHIEditorDS = new CommonPHIEditorDS(); 
     PHIEditorUniquePHIRowDefinition rowToDelete = new PHIEditorUniquePHIRowDefinition(); 
     //Test Case 1 
     AddPHIYieldInfo(target.mCommonPHIEditorDS.PHIYieldParm, 1, 12, 123, 1234, 2001); 
     rowToDelete.ItemID = "2001"; 
     rowToDelete.MetricKeyID = "12"; 
     rowToDelete.ProjectName = "Test"; 
     rowToDelete.ProjectType = "MOR"; 
     rowToDelete.Status = "MOR"; 
     rowToDelete.SubObject = "CFA"; 
     rowToDelete.Factory = "VF"; 
     rowToDelete.ParameterName = "BI%"; 
     target.DeletePHIParmYield(rowToDelete); //error inside here 
     //Assert.AreEqual(0, target.mCommonPHIEditorDS.PHIYieldParm.Rows.Count); 
     Assert.AreEqual(0, target.mCommonPHIEditorDS.PHIYieldParm.Rows.Count); 

    } 

Перейти внутри функции DeletePHIParmYield (rowToDelete):

public void DeletePHIParmYield(PHIEditorUniquePHIRowDefinition rowToDelete) 
     { 
      int id; 

      CommonPHIEditorDS.PHIYieldParmRow sourceRow = GetPHIRow(rowToDelete); 
      if (sourceRow == null) 
       throw new Exception("Row cannot be located!"); 

      if (!sourceRow.IsMetricModelInputIDNull()) 
       id = sourceRow.MetricModelInputID; 
      else 
       id = sourceRow.InputID; 
DeletePHIYieldParmDataAndAcceptChanges(sourceRow); 
      sourceRow.Delete(); 

if (id < 0 && sourceRow.RowState != DataRowState.Detached) //this record is not in DB. No need to call to DB 
       sourceRow.AcceptChanges(); 
     } 

Перейти к внутренней CommonPHIEditorDS.PHIYieldParmRow sourceRow = GetPHIRow (rowToDelete);

public CommonPHIEditorDS.PHIYieldParmRow GetPHIRow(PHIEditorUniquePHIRowDefinition newRowObj) 
    { 
     CommonPHIEditorDS.PHIYieldParmRow row = null; 

     string filter = ConstructFilterUsingPHIEditorUniquePHIRowDefinitionObject(newRowObj); 

     CommonPHIEditorDS.PHIYieldParmRow[] existingRow 
      = (CommonPHIEditorDS.PHIYieldParmRow[])MCommonPhiEditorDs.PHIYieldParm.Select(filter, string.Empty, DataViewRowState.CurrentRows); 



     //var existingRow = from filter in MCommonPhiEditorDs.PHIYieldParm 
     //     where filter.MetricTypeName.StartsWith("BI") 
     //     select existingRow; 
     //row = existingRow.FirstOrdefault(); 



     if (existingRow != null && existingRow.Length == 1) 
      row = existingRow[0]; 

     return row; 
    } 

Данные фильтр: (я изменить на "LIKE" вместо "=", чтобы попробовать)

MetricTypeName = 'BI%' AND Factory = 'VF' И Status = ' MOR»И Имя_проекта = 'Тест' И ProjectType = 'MOR' И SubObjectName = 'КФА' И ItemID = '2001' и MetricKeyID = '12' И MetricModelInputID IS NULL

PHIYieldParmData Таблица содержит столбец :(без данных, я вручную помещаю данные, чтобы попробовать)

DataID, MetricModelInputID, MetricID, InputID, ItemID, DateKey, Value, HrzDisplay, HorizonID, MetricModelID, AggregateItemChar 

Я не мог получить данные при переходе через линию

строка = existingRow [0];

он не может пройти через указанную выше линию, но сразу же перепрыгните на это. Из-за условия if else. Однако, есть проблема в моем existingRow, я не мог загрузить данные в этот

return row; 

Моя строка содержит список данных, в то время как existingRow пуст

Полный код:

public CommonPHIEditorDS.PHIYieldParmRow GetPHIRow(PHIEditorUniquePHIRowDefinition newRowObj) 
{ 
    CommonPHIEditorDS.PHIYieldParmRow row = null; 

    string filter = ConstructFilterUsingPHIEditorUniquePHIRowDefinitionObject(newRowObj); 

    CommonPHIEditorDS.PHIYieldParmRow[] existingRow 
     = (CommonPHIEditorDS.PHIYieldParmRow[])MCommonPhiEditorDs.PHIYieldParm.Select(filter, string.Empty, DataViewRowState.CurrentRows); 

    if (existingRow != null && existingRow.Length == 1)   
     row = existingRow[0]; 

    return row; 
} 
+0

_ "из-за, если другое условие" _ которое еще? Вы использовали отладчик, что такое значение 'filter'? В общем, я бы предпочел Linq-To-DataSet. –

+0

Да, из-за if-else, но я полагаю, что для соответствия условию if, «существующееRow» не должно быть null, но существующееRow возвращает меня null.Внутренний фильтр «MetricTypeName =« BI% »AND Factory = 'VF' AND Status = 'MOR' AND ProjectName = 'Test' AND ProjectType = 'MOR' AND SubObjectName = 'CFA' AND ItemID = '2001' AND MetricKeyID = '1' AND MetricModelInputID IS NULL " –

+0

проблема возникает здесь" CommonPHIEditorDS.PHIYieldParmRow [] existingRow = (CommonPHIEditorDS.PHIYieldParmRow []) MCommonPhiEditorDs.PHIYieldParm.Select (фильтр, string.Empty, DataViewRowState.CurrentRows); ", почему сделать, что «existingRow» мне ничего не возвращает? –

ответ

0

Вы отметили, что это ваш фильтр для DataTable.Select:

MetricTypeName = 'BI%' AND 
Factory = 'VF' AND 
Status = 'MOR' AND 
ProjectName = 'Test' AND 
ProjectType = 'MOR' AND 
SubObjectName = 'CFA' AND 
ItemID = '2001' AND 
MetricKeyID = '1' AND 
MetricModelInputID IS NULL 

Вы хотите использовать вместо этого MetricTypeName LIKE 'BI%'? Если вы используете = вместо LIKE, вы ищете строку exaxt, а не подстроку.

Итак:

MetricTypeName LIKE 'BI%' AND 
// .... 

Но я предпочитаю Linq-To-DataSet:

var rows = from phiRow in MCommonPhiEditorDs.PHIYieldParm 
      where phiRow.MetricTypeName.StartsWith("BI") 
      && phiRow.Factory == "VF" 
      // .... 
      select phiRow; 
CommonPHIEditorDS.PHIYieldParmRow row = rows.FirstOrdefault(); 
+0

Я меняю свое значение с «=» на «LIKE», но я все еще не получаю данные в existingRow, мой существующийRow возвращает мне null –

+0

Я изменил и использовал Linq-To-DataSet, как было предложено выше, но все же не удалось чтобы получить данные для существующей строки ... где я сделал неправильно? Я впервые сделаю это –

+0

Это действительно сложно, без данных образца. Какие строки вы ожидаете, покажите небольшой образец 'DataTable' в вашем вопросе. –

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