powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как получить XSD для базы MSSQL
4 сообщений из 4, страница 1 из 1
Как получить XSD для базы MSSQL
    #32914954
acol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с проблемой.
Имеется DataSet, повторяющий схему базы данных в MSSQL. Когда меняю структуру базы, приходится праллельно вность изменения в DataSet.
Не подскажите, может есть какая утилита, которая строила бы XSD по базе данных?
...
Рейтинг: 0 / 0
Как получить XSD для базы MSSQL
    #32915257
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
простейший способ - есть в студии:
добавляешь к пректу XML Schema (Project->Add New Item->XSD Schema) или DataSet XSD. открываешь окно Server Explorer, выбираешь(добавляешь в него) сервер сети с БД MSSQL.
из SQL Server выбираешь БД и перетягиваешь узел дерева Tables (или выделяешь те таблицы, на которые нужно получить схему) на XSD документ.
PS
некоторые вещи затем приходится доделывать руками
...
Рейтинг: 0 / 0
Как получить XSD для базы MSSQL
    #32915404
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, вот пример небольшого генератора XSD для MS SQL сервера, работающий через OleDb
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
using System;
using System.Data;
using System.Data.OleDb;
using System.Collections;

namespace CreateXSD
{
  class CreateXSD
  {
    [STAThread]
    static void Main(string[] args)
    {
      GenerateXSD("Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=Northwind;Data Source=STORAGE", @"C:\Temp\Schema.xsd", true);
    }
    /**************************************************************************************************************/
    /// <summary>
    /// генерация схемы БД и запись ее в файл
    /// </summary>
    public static void GenerateXSD(string cs, string file, bool createConstraints)
    { OleDbConnection cn=new OleDbConnection(cs);
      DataSet         ds=new DataSet(cn.Database);
      try
      {
        cn.Open();
        // добавить все TABLE
        AddTables(cn, ds, null, "TABLE");
        // добавить все VIEW
        AddTables(cn, ds, null, "VIEW");
        // добавить RELATIONS для выбранных таблиц
        AddRealations(cn, ds, createConstraints);
        // запись схемы в файл
        ds.WriteXmlSchema(file);
      }
      catch(Exception ex)
      { Console.WriteLine("{0}", ex.ToString());
        Console.ReadLine();
      }
      finally
      {
        if(cn.State!=ConnectionState.Closed) cn.Close();
      }
      Console.WriteLine("Total: {0} tables/views, {1} relations", ds.Tables.Count, ds.Relations.Count);
      Console.WriteLine("Press [Enter] for exit");
      Console.ReadLine();
    }
    /**************************************************************************************************************/
    /// <summary>
    /// добавление схем таблиц (TABLE) и представлений (VIEW)
    /// </summary>
    public static void AddTables(OleDbConnection cn, DataSet ds, string name, string filter)
    {
      DataTable ts=cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[]{null, null, name, filter});
      for(int k=0; k<ts.Rows.Count; k++) // таблицы
      { string tbln=Convert.ToString(ts.Rows[k]["TABLE_NAME"]);
        OleDbDataAdapter  ad=new OleDbDataAdapter("SELECT * FROM ["+tbln+"]", cn);
        ad.FillSchema(ds, SchemaType.Mapped, tbln);
      }
    }
    /**************************************************************************************************************/
    /// <summary>
    /// добавление DataRelation для всех таблиц в DataSet
    /// </summary>
    public static void AddRealations(OleDbConnection cn, DataSet ds, bool createConstraints)
    {
      for(int k=0; k<ds.Tables.Count; k++)
      {
        string ft=ds.Tables[k].TableName; // имя таблицы, для которой строим FK
        DataTable tr=cn.GetOleDbSchemaTable(OleDbSchemaGuid.Foreign_Keys, new object[]{null, null, null, null, null, ft});
        DataView  dt=new DataView(tr);
        dt.Sort="PK_TABLE_NAME, ORDINAL"; // отсортируем DataView по имени PK таблицы и порядковому номеру колонок в ключе

        string pt=string.Empty;         // имя PK таблицы
        string rn=string.Empty;         // имя Relation'а
        ArrayList ptc=new ArrayList();  // имена полей ключа в PK таблице
        ArrayList ftc=new ArrayList();  // имена полей ключа в FK таблице

        for(int m=0; m<dt.Count; m++)
        {
          string tb=Convert.ToString(dt[m]["PK_TABLE_NAME"]);
          string nm=Convert.ToString(dt[m]["FK_NAME"]);
          if(!ds.Tables.Contains(tb)) continue; // таблицы нет - нехера и смотреть...

          if((string.Compare(tb, pt, true)!=0 || string.Compare(rn, nm, true)!=0) && ptc.Count>0)
          { // построить Realation для предыдущей PK таблицы
            AddRelation(ds, rn, pt, ptc, ft, ftc, createConstraints);
            ptc.Clear();
            ftc.Clear();
          }
          pt=tb; rn=nm;
          ptc.Add(dt[m]["PK_COLUMN_NAME"]);
          ftc.Add(dt[m]["FK_COLUMN_NAME"]);
        }

        if(ptc.Count>0)
        { // построить Relation для последней PK таблицы
          AddRelation(ds, rn, pt, ptc, ft, ftc, createConstraints);
        }
      }
    }
    /**************************************************************************************************************/
    /// <summary>
    /// добавление foreign key как DataRelation
    /// </summary>
    public static void AddRelation(DataSet ds, string relationName, string pt, ArrayList ptf, string ft, ArrayList ftf, bool createConstraints)
    { DataColumn[] ptc=new DataColumn[ptf.Count];
      DataColumn[] ftc=new DataColumn[ftf.Count];
      for(int k=0; k<ptf.Count; k++)
      { ptc[k]=ds.Tables[pt].Columns[(string)ptf[k]];
        ftc[k]=ds.Tables[ft].Columns[(string)ftf[k]];
      }
      try
      { // вот здесь бывают всякие блядские штучки для различных типов БД
        ds.Relations.Add((relationName==string.Empty) ? null : relationName, ptc, ftc, createConstraints);
      }
      catch(Exception ex)
      {
        Console.WriteLine("\r\n*** {0}", ex.Message);
        Console.WriteLine("\r\n*** PK table: {0}", pt);
        for(int k=0; k<ptc.Length; k++) Console.WriteLine("\t{0}", ptc[k]);
        Console.WriteLine("\r\n*** FK table: {0}", ft);
        for(int k=0; k<ftc.Length; k++) Console.WriteLine("\t{0}", ftc[k]);
      }
    }
    /**************************************************************************************************************/
  }
}
...
Рейтинг: 0 / 0
Как получить XSD для базы MSSQL
    #32915979
acol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо.
То, что нужно!!!!!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как получить XSD для базы MSSQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]