Скопируйте C# DataTable и преобразуйте все значения в строку

У меня есть DataTable с колонками разных типов. Что я хочу это DataTable с одинаковыми именами столбцов, но все значения являются строками. То есть если это первое:

Name   Age
-----------
John   31
Alice  27
Marge  45

где имя является String столбец и возраст Int32 колонка, что я хочу это:

Name   Age
-----------
John   31
Alice  27
Marge  45

где Имя и Возраст оба являются строковыми столбцами. Выходная таблица должна содержать те же значения, что и входная таблица, но каждое значение должно быть преобразовано в строку. Может ли кто-нибудь дать представление о том, как можно это сделать? Я думал о том, чтобы сделать что-то вроде

foreach (DataColumn col in inputTable.Columns)
{
    outputTable.Columns.Add(col.ColumnName, typeof(string));

    foreach (DataRow row in inputTable.Rows)
    {
        ...??
    }
}

Или, может быть, есть лучший или более эффективный подход? Любое руководство будет с благодарностью.

3 ответа

Решение

Вы не можете изменить тип столбца в DataTable если уже есть записи. Вы можете Clone DataTable, а затем изменить тип столбца в каждом столбце клонированной таблицы. Позже вы можете импортировать строки.

DataTable dtClone = dt.Clone(); //just copy structure, no data
for (int i = 0; i < dtClone.Columns.Count; i++)
{
    if (dtClone.Columns[i].DataType != typeof(string))
        dtClone.Columns[i].DataType = typeof(string);
}

foreach (DataRow dr in dt.Rows)
{
    dtClone.ImportRow(dr);
}

dtClone будет иметь каждый столбец со строкой и все данные из исходной таблицы dt

Вы можете использовать встроенный метод toString().

foreach (DataColumn col in inputTable.Columns)
{
outputTable.Columns.Add(col.ColumnName, typeof(string));

foreach (DataRow row in inputTable.Rows)
{
outputTable.Columns.Add(row.toString());
}
}

В этом коде вы можете преобразовать весь набор данных в одну строку.

string ConvertDatasetToString(DataSet Ds)
{
    string OUT = "";
    for (int t = 0; t < Ds.Tables.Count; t++)
    {
        for (int r = 0; r < Ds.Tables[t].Rows.Count; r++)
        {
            for (int c = 0; c < Ds.Tables[t].Columns.Count; c++)
            {
                string s = Ds.Tables[t].Rows[r][c].ToString();
                OUT += s;
            }
        }
    }
    return OUT;
}

если вы хотите преобразовать один объект данных в одну строку, вы можете опустить первый for

Другие вопросы по тегам