Использование операторов с двумя разными типами - PullRequest
0 голосов
/ 11 октября 2019

У меня есть DataView, который уже создан. Я создал новую DataTable из существующего DataView и сделал эти данные DataView для экспорта в XlSX. Я пытаюсь проверить и посмотреть, есть ли в последнем столбце целое число больше 0. Если это так, следует удалить строку. Поскольку это два разных типа, так как один является объектом, а другой - двойным, это не так просто, как я думал.

Я рассмотрел ответ на вопросе Оператор '<' нельзя применить коперанды типа 'object' и 'int' </a>

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

private DataView CreateExhaustionDataView()
{
    DataTable dt = BuildFufillmentDataTable();
    DataView dv = new DataView(dt, "", "Department,Date", DataViewRowState.CurrentRows);

    DataTable result = dv.ToTable(true,"Department","Date","Remaining");
    var dr = result.NewRow();
    if (Convert.ToDouble(dr["Remaining"]) >= 0.0)
    {
        dr.Delete();
    }
    DataView dvresult = new DataView(result);
    return dvresult;
}

Я получаю это сообщение об ошибке при попытке преобразовать:

System.InvalidCastException: «Объект не может быть приведен из DBNull к другим типам.»Я получаю эту ошибку только при экспорте данных. Насколько разбора это не строит вообще.

Любые советы или маршруты, которые я пропустил, я был бы очень признателен!

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Оказывается, ОП хотел, по сути, отфильтровать result.

Вы не смотрите на первую строку, вы создаете новую строку с теми же столбцами, что и в DataTable, и смотрите на это. Эта новая строка даже не будет в DataTable, пока вы не добавите ее явно.

var dr = result.NewRow();

Все значения в dr равны нулю, поскольку вы только что создали бедняжку. Вы также не проверяете, является ли столбец нулевым, что вы должны сделать.

if (result.Rows.Count > 0)
{
    var firstrow = result.Rows[0];

    if (firstrow["Remaining"] != DBNull.Value 
        && Convert.ToDouble(firstrow["Remaining"]) >= 0.0)
    {
        //  Or maybe firstrow.Delete(), I don't have time to test this. 
        //  If one doesn't work, try the other. 
        result.Rows.Remove(firstrow);
    }
}
0 голосов
/ 14 октября 2019

Я нашел способ просто отсортировать таблицу данных без использования цикла For, как обсуждалось ранее. Я прокомментировал цикл For Loop, чтобы проверить сортировку, и на самом деле он работает так же хорошо без такого количества строк кода.

private DataView CreateExhaustionDataView()
{
    DataTable dt = BuildFufillmentDataTable();
    DataView dv = new DataView(dt, "", "Department,Date", DataViewRowState.CurrentRows);
    DataTable result = dv.ToTable(true, "Department", "Date", "Remaining");
    /*for (int i= result.Rows.Count-1; i >= 0; i--)
    {
        if (result.Rows.Count > 0)
        {
            var firstrow = result.Rows[i];

            if (firstrow["Remaining"] != DBNull.Value
                && Convert.ToDouble(firstrow["Remaining"]) > 0.0)
            {
                firstrow.Delete();
            }
        }
    }*/ 
    DataView dvresult = new DataView(result, "Remaining <= 0", "Department, Date", DataViewRowState.CurrentRows);
    return dvresult;
}
...