Как я могу преобразовать строки объекта C# Datatable в серию операторов выбора? - PullRequest
0 голосов
/ 31 января 2020

Я работал над отладкой отдельной проблемы и обнаружил, что для решения этой проблемы было бы полезно создать метод расширения, который принимает объект с данными c# и преобразует содержимое каждой из его строк. в серию операторов SELECT, извлекая данные из каждой ячейки и имя столбца каждого столбца, а затем помещая UNION ALL между ними как способ перестройки таблицы и всего ее содержимого.

В действительности, мы могли бы создать что-то вроде следующего, которое вы можете вставить в ssms, чтобы легко просмотреть содержимое:

SELECT "1-1-2020" as [CreateDate], 18 as [NumOfGuests] 
UNION ALL
SELECT "1-2-2020" as [CreateDate], 48 as [NumOfGuests] 

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

ОБНОВЛЕНИЕ:

Чтобы ответить на вопрос Оливье относительно того, в чем конкретно проблема; Я думал о том, чтобы просмотреть содержимое таблицы следующим образом (у меня еще не было возможности проверить это), но я чувствую, что должно быть лучшее решение, чем то, которое я придумал.

public static string ParseDataColumns(this DataTable dataTable)
{
    var sb = "";

    if (dataTable.Columns.Count <= 0) return sb;
    sb += "SELECT ";
    foreach (DataRow row in dataTable.Rows)
    {
        foreach (DataColumn column in dataTable.Columns)
        {
            if (column.Ordinal != 0)
            {
                sb += ", " + row[column].ToString() + " AS [" + column.ColumnName + "]";    
            }
            else
            {
                sb += row[column].ToString() + " AS [" + column.ColumnName + "]";
            }
        }
    sb += "UNION ALL" + dataTable.TableName;
    }
    return sb.ToString();
}

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Вы можете использовать LINQ с вспомогательным методом для этого. Помощник преобразует тип данных C# в литерал SQL. Возможно, вам понадобится добавить другие случаи:

public static class DataRowExt {
    public static string SQLLiteral(this DataRow r, DataColumn c) {
        if (c.DataType == typeof(String))
            return $"\"{r.Field<string>(c.ColumnName)}\"";
        else if (c.DataType == typeof(DateTime))
            return $"\"{r.Field<DateTime>(c.ColumnName).ToString("yyyy-MM-dd HH:mm:ss.fff")}\"";
        else
            return r[c.ColumnName].ToString();
    }

    public static string SQLLiteral(this DataTable dt) =>
        String.Join("\nUNION ALL\n", dt.AsEnumerable().Select(r => "SELECT " + String.Join(", ", dt.Columns.Cast<DataColumn>().Select(c => $"{r.SQLLiteral(c)} AS [{c.ColumnName}]"))));
}

Теперь ваш ответ прост:

public static string ParseDataColumns(this DataTable dataTable) => dataTable.SQLLiteral();
0 голосов
/ 31 января 2020

Используйте linq, чтобы получить все данные из таблицы c#, а затем сериализовать их в файл json. Разобрать строку json как список строковых кортежей. Наконец, преобразуйте каждый кортеж в строку, добавив «select» и другие ключевые слова sql. Это будет работать для простых форматов данных.

Кроме того, вы можете просто экспортировать таблицу в формате CSV и импортировать ее в ssms.

...