2009-05-07 2 views
0

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

Он должен создать ...

1.) XSD-файл.

2.) типизированный набор данных represnting базы данных

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

4.) Таблица Адаптеры для каждой таблицы.

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

ответ

2

Я, как правило, согласен с jcollum на этом, используя типизированный набор данных во время выполнения, вероятно, является неправильным способом. Если, с другой стороны, вы просто хотите получить структурированные данные (ака, 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

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

+0

xsd.exe будет генерировать файлы классов из существующего XSD defi. файл. Мне также нужно генерировать XSD. И мне также нужно создать адаптеры для таблицы. –

+0

Вместо того, чтобы запускать XSD.EXE, вы также можете напрямую поговорить с классом XsdTool.Xsd или даже с System.Data.Design.TypedDataSetGenerator и System.Xml.Serialization.XmlReflectionImporter/XmlSchemaExporter. –

1

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

+0

+1 они больно делать сами, и часто терпеть неудачу, другие люди проделали работу по решению этих проблем, эти люди сделали ОРМ. –

+0

да, вы правы. у нас есть собственный ORM поверх типизированных наборов данных. мы используем типизированные наборы данных так же, как модель данных, и мы не сильно зависим от них. Но все же нам нужно как-то создать это во время выполнения! Есть идеи. –

+0

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

Смежные вопросы