Как создать строго типизированный набор данных во время выполнения с помощью C #? - PullRequest
0 голосов
/ 07 мая 2009

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

Это должно создать ...

1.) XSD-файл.

2.) Типизированный набор данных, представляющий базу данных

3.) Типизированные оболочки для всех таблиц базы данных и столбцов в таблицах.

4.) TableAdapters для каждой таблицы.

Так что мне нужно генерировать тот же типизированный набор данных во время выполнения, который обычно создается во время разработки с использованием конструктора типизированных наборов данных Visual Studio.

Ответы [ 3 ]

2 голосов
/ 07 мая 2009

Я склонен согласиться с jcollum в этом вопросе, поэтому использование Typed Dataset во время выполнения, вероятно, неправильный путь. Если, с другой стороны, вы просто хотите иметь возможность получать структурированные данные (или DataTable) из базы данных во время выполнения, вы можете использовать отражение для создания TableAdapter из произвольного результата данных.

var results = (from data in db.SomeTable select data).ToArray();
DataTable dt = ObjectArrayToDataTable(results);
// At this point you have a properly structure DataTable.

// Here is your XSD, if absolutely needed.
dt.WriteXMLSchema("c:\somepath\somefilename.xsd");

private static System.Data.DataTable ObjectArrayToDataTable(object[] data)
{
    System.Data.DataTable dt = new System.Data.DataTable();
    // if data is empty, return an empty table
    if (data.Length == 0) return dt;

    Type t = data[0].GetType();
    System.Reflection.PropertyInfo[] piList = t.GetProperties();

    foreach (System.Reflection.PropertyInfo p in piList)
    {
        dt.Columns.Add(new System.Data.DataColumn(p.Name, p.PropertyType));
    }

    object[] row = new object[piList.Length];

    foreach (object obj in data)
    {
        int i = 0;
        foreach (System.Reflection.PropertyInfo pi in piList)
        {
            row[i++] = pi.GetValue(obj, null);
        }
        dt.Rows.Add(row);
    }

    return dt;
}

Вы можете применить тот же принципал для создания структурированного DataSet и легко создать для него DataAdapter.

Или, возможно, я неправильно понимаю ваши требования.

2 голосов
/ 07 мая 2009

Возможно, вы могли бы использовать XSD.EXE. Запустите его из вашей программы ...

1 голос
/ 07 мая 2009

Учитывая мой опыт работы с типизированными наборами данных в прошлом - и все сопутствующие им сбои и проблемы - я настоятельно рекомендую вам изучить это с помощью ORM mapper. Другими словами, убегайте от Типизированных наборов данных.

...