Разобрать TimeSpan с DataRowExtension - PullRequest
       6

Разобрать TimeSpan с DataRowExtension

0 голосов
/ 12 декабря 2018

Я хочу взять значение поля из DataRow как TimeSpan (формат как mm: ss) с DataRowExtension, но это дает мне System.InvalidCastException, как вы можете видеть ниже

var time = staffItems.Rows[0].Field<TimeSpan>("TIME_DURATION"); // System.InvalidCastException

, но когда это принятьзначение в виде строки и после Parse to TimeSpan проблем не возникает.

var time = staffItems.Rows[0].Field<string>("TIME_DURATION"); // time : 0:43
var time2 = TimeSpan.Parse(time); // time2 : 00:43:00

И вопрос в том, как я могу сделать это с DataRowExtension без какого-либо дополнительного анализа или приведения.

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Приведенный ниже метод будет анализировать string до TimeSpan в методе расширения DataRow.

public static TimeSpan ExtractTimeData(this DataRow row, string column)
{
    // check column exists in dataTable
    var exists = row.Table.Columns.Contains(column);

    if (exists)
    {
        // ensure we're not trying to parse null value
        if (row[column] != DBNull.Value)
        {
            TimeSpan time;

            if (TimeSpan.TryParse(row[column].ToString(), out time))
            {
                // return if we can parse to TimeSpan
                return time;
            }
        }
    }

    // return default TimeSpan if there is an error
    return default(TimeSpan);
}

И вы можете использовать его как:

TimeSpan time = row.ExtractTimeData("TIME_DURATION");
string timeString = time.ToString(@"h\:mm");
0 голосов
/ 21 декабря 2018

Возможно, поле TIME_DURATION имеет вид vharchar или что-то еще из DataTable.Это должно быть эквивалентно TimeSpan.

0 голосов
/ 12 декабря 2018

Сначала вам нужно проанализировать, а затем получить временную часть

var time = TimeSpan.Parse(staffItems.Rows[0]["TIME_DURATION"]);
var time2 = time.ToString(@"mm\:ss");

, если вы хотите получить datarowextension.Вы должны создать свой datatable и указать объект времени для столбца «TIME_DURATION».Вы можете сделать это следующим способом:

using System;
using System.Data;

class Program
{
    static void Main()
    {
        //
        // Loop over DataTable rows and call the Field extension method.
        //
        foreach (DataRow row in GetTable().Rows)
        {
            // Get first field by column index.
            int weight = row.Field<int>(0);

            // Get second field by column name.
            string name = row.Field<string>("Name");

            // Get third field by column index.
            string code = row.Field<string>(2);

            // Get fourth field by column name.
            DateTime date = row.Field<DateTime>("Date");

            // Display the fields.
            Console.WriteLine("{0} {1} {2} {3}", weight, name, code, date);
        }
    }

    static DataTable GetTable()
    {
        DataTable table = new DataTable(); // Create DataTable
        table.Columns.Add("Weight", typeof(int)); // Add four columns
        table.Columns.Add("Name", typeof(string));
        table.Columns.Add("Code", typeof(string));
        table.Columns.Add("Date", typeof(DateTime));
        table.Rows.Add(57, "Koko", "A", DateTime.Now); // Add five rows
        table.Rows.Add(130, "Fido", "B", DateTime.Now);
        table.Rows.Add(92, "Alex", "C", DateTime.Now);
        table.Rows.Add(25, "Charles", "D", DateTime.Now);
        table.Rows.Add(7, "Candy", "E", DateTime.Now);
        return table;
    }
}
...