ADO .Net полная структура БД
От: Jurik_  
Дата: 30.03.06 11:43
Оценка:
Добрый день. Есть такой вопрос...
Как мне получить полную структуру БД со всеми связями таблиц, первичными ключами, т. д. и записать её в DataSet?
Заранее извеняюсь за дублирование вопроса, если таковое имеет место .
Re: ADO .Net полная структура БД
От: barcik  
Дата: 30.03.06 12:45
Оценка:
Здравствуйте, Jurik_, Вы писали:

J_>Добрый день. Есть такой вопрос...

J_>Как мне получить полную структуру БД со всеми связями таблиц, первичными ключами, т. д. и записать её в DataSet?
J_>Заранее извеняюсь за дублирование вопроса, если таковое имеет место .

Возможно тебя интересует
SqlDataAdapter da = new SqlDataAdapter();
da.FillSchema(ds, SchemaType.Mapped);
da.Fill(dataSet);

В крайнем случае первичные ключи достаются. Но я юзал для одной таблицы — для всей БД не тестил.
Re: ADO .Net полная структура БД
От: Аноним  
Дата: 30.03.06 13:04
Оценка:
Мне кажется не надо забивать всю структуру БД в датаСет достаточно нескольких необходимых таблиц, ведь бывают такие БД что их структуру на 100% не знает никто
Re[2]: ADO .Net полная структура БД
От: Jurik_  
Дата: 30.03.06 13:50
Оценка:
Здравствуйте, barcik, Вы писали:

B>Здравствуйте, Jurik_, Вы писали:


J_>>Добрый день. Есть такой вопрос...

J_>>Как мне получить полную структуру БД со всеми связями таблиц, первичными ключами, т. д. и записать её в DataSet?
J_>>Заранее извеняюсь за дублирование вопроса, если таковое имеет место .

B>Возможно тебя интересует

B>SqlDataAdapter da = new SqlDataAdapter();
B>da.FillSchema(ds, SchemaType.Mapped);
B>da.Fill(dataSet);

B>В крайнем случае первичные ключи достаются. Но я юзал для одной таблицы — для всей БД не тестил.


Ключи действительно достать не так сложно, но вот что делать со связями ума не приложу...
Re[2]: ADO .Net полная структура БД
От: Jurik_  
Дата: 30.03.06 13:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Мне кажется не надо забивать всю структуру БД в датаСет достаточно нескольких необходимых таблиц, ведь бывают такие БД что их структуру на 100% не знает никто


Всё было бы хорошо, если бы заранее была известна структура БД, но она может меняться... Поэтому и задался таким вопросом.
Re[3]: ADO .Net полная структура БД
От: _FRED_ Черногория
Дата: 30.03.06 14:13
Оценка:
Здравствуйте, Jurik_, Вы писали:

B>>В крайнем случае первичные ключи достаются. Но я юзал для одной таблицы — для всей БД не тестил.

J_>Ключи действительно достать не так сложно, но вот что делать со связями ума не приложу...

Врукопашную из таблицы IndexColumns схемы.
... << RSDN@Home 1.2.0 alpha rev. 648>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re: ADO .Net полная структура БД
От: Smarty Россия  
Дата: 31.03.06 08:52
Оценка:
Здравствуйте, Jurik_, Вы писали:

J_>Добрый день. Есть такой вопрос...

J_>Как мне получить полную структуру БД со всеми связями таблиц, первичными ключами, т. д. и записать её в DataSet?
J_>Заранее извеняюсь за дублирование вопроса, если таковое имеет место .

Для ADO.NET2.0 см. DbConnection.GetSchema(...). Будут вам и индексы и форин-кеи и прочее.
<<Rule of Forum: После того, как вопрос задан... не поленитесь поставить отвечавшему оценку!>>
Re[4]: ADO .Net полная структура БД
От: Jurik_  
Дата: 31.03.06 12:32
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Jurik_, Вы писали:


B>>>В крайнем случае первичные ключи достаются. Но я юзал для одной таблицы — для всей БД не тестил.

J_>>Ключи действительно достать не так сложно, но вот что делать со связями ума не приложу...

_FR>Врукопашную из таблицы IndexColumns схемы.


Что за таблица IndexColumns? Где она содержится?
Re[2]: ADO .Net полная структура БД
От: Jurik_  
Дата: 31.03.06 12:36
Оценка:
Здравствуйте, Smarty, Вы писали:

S>Здравствуйте, Jurik_, Вы писали:


J_>>Добрый день. Есть такой вопрос...

J_>>Как мне получить полную структуру БД со всеми связями таблиц, первичными ключами, т. д. и записать её в DataSet?
J_>>Заранее извеняюсь за дублирование вопроса, если таковое имеет место .

S>Для ADO.NET2.0 см. DbConnection.GetSchema(...). Будут вам и индексы и форин-кеи и прочее.

Всё, спасибо всем огромное, разобрался.
Re[2]: ADO .Net полная структура БД
От: Jurik_  
Дата: 31.03.06 16:59
Оценка:
Здравствуйте, Smarty, Вы писали:

S>Здравствуйте, Jurik_, Вы писали:


J_>>Добрый день. Есть такой вопрос...

J_>>Как мне получить полную структуру БД со всеми связями таблиц, первичными ключами, т. д. и записать её в DataSet?
J_>>Заранее извеняюсь за дублирование вопроса, если таковое имеет место .

S>Для ADO.NET2.0 см. DbConnection.GetSchema(...). Будут вам и индексы и форин-кеи и прочее.


Рановато я написал ответ ... GetSchema получает только первичные и уникальные ключи. Сколько не пытался, у меня не получилось получить FOREIGN KEYS... Если не сложно, напишите примерчик пожалуйста.

И ещё...
Может быть эту выборку проще сделать каким нибудь SQL запросом?

Помогите решить проблему, уж очень хочется разобраться. Заранее благодарен.
Re[3]: ADO .Net полная структура БД
От: GlebZ Россия  
Дата: 31.03.06 18:34
Оценка:
Здравствуйте, Jurik_, Вы писали:

J_>Может быть эту выборку проще сделать каким нибудь SQL запросом?

Какая база данных?
Re[5]: ADO .Net полная структура БД
От: _FRED_ Черногория
Дата: 01.04.06 09:42
Оценка:
Здравствуйте, Jurik_, Вы писали:

B>>>>В крайнем случае первичные ключи достаются. Но я юзал для одной таблицы — для всей БД не тестил.

J_>>>Ключи действительно достать не так сложно, но вот что делать со связями ума не приложу...
_FR>>Врукопашную из таблицы IndexColumns схемы.
J_>Что за таблица IndexColumns? Где она содержится?

Это я наврал Из схемы, получаемой методом DbConnection.GetSchema(…) информацию о внешних ключах, к сожелению, не вытащить .
Таблицы, столбцы и первичные ключи можно получить так, как здесь
Автор: _FRED_
Дата: 15.03.06
.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: ADO .Net полная структура БД
От: Аноним  
Дата: 30.03.06 14:33
Оценка:
Например так:
using (OleDbConnection connection = new OleDbConnection("Provider=SQLOLEDB; Data Source=;Initial Catalog=;Integrated Security=SSPI"))
{
connection.Open();
DataTable OleDbSchemaGuid_Foreign_Keys = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Foreign_Keys, new object[] { null });
}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: ADO .Net полная структура БД
От: Аноним  
Дата: 31.03.06 01:42
Оценка:
Помоему класс XXXConection может дать данные о структуре базы данных. Поискай там может поможет


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: ADO .Net полная структура БД
От: Аноним  
Дата: 31.03.06 05:02
Оценка:
>Врукопашную из таблицы IndexColumns схемы.<
ИМХО разбируть сист таблицы себе копать яму. Есть же рекомендуемый гуманный способ использовать вьюшки INFORMATION_SCHEMA, там можно собрать практически всю информацию и связях в том числе. Смотрим фак http://www.gotdotnet.ru/DotNet/FAQ/DataWorks/MSSQLDesignNDev/60355.aspx
А если уж совсем по взрослому: смотрим Microsoft.SqlServer.Management.Smo в FW2 и радуемся жизни
С/у Дмитрий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: ADO .Net полная структура БД
От: Аноним  
Дата: 31.03.06 17:11
Оценка:
2 Jurik
>Может быть эту выборку проще сделать каким нибудь SQL запросом?

Все можно делать намного проще, если перейти на нормальную СУБД.
Против глупости сами боги бороться бессильны.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: ADO .Net полная структура БД
От: Smarty Россия  
Дата: 01.04.06 12:39
Оценка:
Здравствуйте, Jurik_, Вы писали:

J_>Рановато я написал ответ ... GetSchema получает только первичные и уникальные ключи. Сколько не пытался, у меня не получилось получить FOREIGN KEYS... Если не сложно, напишите примерчик пожалуйста.

Легко. Исходные данные: база — TestBase, в ней схема MyScProbe, а в ней таблица TesTtable_22. Последняя имеет 2 форин-кея: TesTtable_22_fk,TesTtable_22_fk2. Хотим их вытащить:
        public static string GetForeignKeys()
        {
            DataTable schema;
            string info = string.Empty;

            using(System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(@"Data Source=.\SQLExpress;Initial Catalog=TestBase;Integrated Security=SSPI;"))
            {
                string[] sa = new string[3];
                sa[0]="TestBase";
                sa[1]="MyScProbe";
                sa[2]="TesTtable_22";
                conn.Open();
                schema = conn.GetSchema("ForeignKeys", sa);
            }
            foreach(DataColumn col in schema.Columns)
                info += col.ColumnName + "\t\t";
            info += Environment.NewLine + "-----------------------------------------------------------------------" + Environment.NewLine;
            foreach(DataRow row in schema.Rows)
            {
                foreach(DataColumn col in schema.Columns)
                    info += row[col.ColumnName].ToString() + "\t\t";
                info += Environment.NewLine;
            }
            return info;
        }

По итогу:

CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE IS_DEFERRABLE INITIALLY_DEFERRED
-----------------------------------------------------------------------
TestBase MyScProbe TesTtable_22_fk TestBase MyScProbe TesTtable_22 FOREIGN KEY NO NO
TestBase MyScProbe TesTtable_22_fk2 TestBase MyScProbe TesTtable_22 FOREIGN KEY NO NO


J_>И ещё...

J_>Может быть эту выборку проще сделать каким нибудь SQL запросом?
Т.е. то, что выше — сложно?? Ну извините...
<<Rule of Forum: После того, как вопрос задан... не поленитесь поставить отвечавшему оценку!>>
Re[4]: ADO .Net полная структура БД
От: _FRED_ Черногория
Дата: 01.04.06 12:56
Оценка:
Здравствуйте, Smarty, Вы писали:

J_>>Рановато я написал ответ ... GetSchema получает только первичные и уникальные ключи. Сколько не пытался, у меня не получилось получить FOREIGN KEYS... Если не сложно, напишите примерчик пожалуйста.

S>Легко. Исходные данные: база — TestBase, в ней схема MyScProbe, а в ней таблица TesTtable_22. Последняя имеет 2 форин-кея: TesTtable_22_fk,TesTtable_22_fk2. Хотим их вытащить:

S>По итогу:

S>CONSTRAINT_CATALOG    CONSTRAINT_SCHEMA    CONSTRAINT_NAME        TABLE_CATALOG    TABLE_SCHEMA    TABLE_NAME    CONSTRAINT_TYPE    IS_DEFERRABLE    INITIALLY_DEFERRED
S>------------------------------------------------------------------------------------------------------------------------------------------------------------------------
S>TestBase        MyScProbe        TesTtable_22_fk        TestBase    MyScProbe    TesTtable_22    FOREIGN KEY    NO        NO
S>TestBase        MyScProbe        TesTtable_22_fk2    TestBase    MyScProbe    TesTtable_22    FOREIGN KEY    NO        NO



Ну и?? Как их этих данных построить внешнии ключи? Здесь же только имя ограничения и имя таблицы. откуда взять имена колонок-то?
Help will always be given at Hogwarts to those who ask for it.
Re[5]: ADO .Net полная структура БД
От: Smarty Россия  
Дата: 01.04.06 15:38
Оценка: 2 (1)
Здравствуйте, _FRED_, Вы писали:

_FR>Ну и?? Как их этих данных построить внешнии ключи? Здесь же только имя ограничения и имя таблицы. откуда взять имена колонок-то?


Мда... Лишний раз убеждаюсь, что у MS совершенно гениальные решения соседствуют с откровенными ляпами. Разумеется проектировщикам GetSchema следовало написать ГОРАЗДО более изощренный запрос на ForeignKeys. Потому что в этом аспекте вопрос "а на какую колонку наложено ограничение?" настолько очевиден, что... Мда. Ну чего — опять придется грязь месить. А так хотелось красиво. Короче — вот по такому запросу:
        public static DataTable GetIndexColumnsFromInformationSchema()
        {
            DataTable schema = new DataTable();

            using(System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(@"Data Source=.\SQLExpress;Initial Catalog=TestBase;Integrated Security=SSPI;"))
            {
                System.Data.SqlClient.SqlDataAdapter schemaDA = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE", conn);
                schemaDA.Fill(schema);
            }
            return schema;
        }

будет возвращена таблица где ИМЯ форин-ключа будет ссылаться на КОЛОНКУ к которой он прикручен. Т.е. если у нас есть таблицы Users и UserRoles то из кода моего первого поста
Автор: Smarty
Дата: 01.04.06
мы узнаем, что у второй в принципе есть форин-кей с именем UserRoles_fk. Из кода чуть выше мы узнаем, что этот форин-кей наложен на колонку UserID этой же таблицы. Из того же кода мы узнаем, что есть примари-кей PK__Users__32E0915F и принадлежит он таблице Users. Наконец кодом
        public static DataTable GetIndexColumnsFromInformationSchema()
        {
            DataTable schema = new DataTable();

            using(System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(@"Data Source=.\SQLExpress;Initial Catalog=TestBase;Integrated Security=SSPI;"))
            {
                System.Data.SqlClient.SqlDataAdapter schemaDA = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS", conn);
                schemaDA.Fill(schema);
            }
            return schema;
        }

мы узнаем, что UserRoles_fk подвязан именно на PK__Users__32E0915F. "Грамотный" join-запрос пишите сами, я вам старатегическое направление указываю.
<<Rule of Forum: После того, как вопрос задан... не поленитесь поставить отвечавшему оценку!>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.