Добрый день. Есть такой вопрос...
Как мне получить полную структуру БД со всеми связями таблиц, первичными ключами, т. д. и записать её в DataSet?
Заранее извеняюсь за дублирование вопроса, если таковое имеет место .
Здравствуйте, 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% не знает никто
Здравствуйте, barcik, Вы писали:
B>Здравствуйте, Jurik_, Вы писали:
J_>>Добрый день. Есть такой вопрос... J_>>Как мне получить полную структуру БД со всеми связями таблиц, первичными ключами, т. д. и записать её в DataSet? J_>>Заранее извеняюсь за дублирование вопроса, если таковое имеет место .
B>Возможно тебя интересует B>SqlDataAdapter da = new SqlDataAdapter(); B>da.FillSchema(ds, SchemaType.Mapped); B>da.Fill(dataSet);
B>В крайнем случае первичные ключи достаются. Но я юзал для одной таблицы — для всей БД не тестил.
Ключи действительно достать не так сложно, но вот что делать со связями ума не приложу...
Здравствуйте, Аноним, Вы писали:
А>Мне кажется не надо забивать всю структуру БД в датаСет достаточно нескольких необходимых таблиц, ведь бывают такие БД что их структуру на 100% не знает никто
Всё было бы хорошо, если бы заранее была известна структура БД, но она может меняться... Поэтому и задался таким вопросом.
Здравствуйте, 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.
Здравствуйте, Jurik_, Вы писали:
J_>Добрый день. Есть такой вопрос... J_>Как мне получить полную структуру БД со всеми связями таблиц, первичными ключами, т. д. и записать её в DataSet? J_>Заранее извеняюсь за дублирование вопроса, если таковое имеет место .
Для ADO.NET2.0 см. DbConnection.GetSchema(...). Будут вам и индексы и форин-кеи и прочее.
<<Rule of Forum: После того, как вопрос задан... не поленитесь поставить отвечавшему оценку!>>
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, Jurik_, Вы писали:
B>>>В крайнем случае первичные ключи достаются. Но я юзал для одной таблицы — для всей БД не тестил. J_>>Ключи действительно достать не так сложно, но вот что делать со связями ума не приложу...
_FR>Врукопашную из таблицы IndexColumns схемы.
Здравствуйте, Smarty, Вы писали:
S>Здравствуйте, Jurik_, Вы писали:
J_>>Добрый день. Есть такой вопрос... J_>>Как мне получить полную структуру БД со всеми связями таблиц, первичными ключами, т. д. и записать её в DataSet? J_>>Заранее извеняюсь за дублирование вопроса, если таковое имеет место .
S>Для ADO.NET2.0 см. DbConnection.GetSchema(...). Будут вам и индексы и форин-кеи и прочее.
Всё, спасибо всем огромное, разобрался.
Здравствуйте, Smarty, Вы писали:
S>Здравствуйте, Jurik_, Вы писали:
J_>>Добрый день. Есть такой вопрос... J_>>Как мне получить полную структуру БД со всеми связями таблиц, первичными ключами, т. д. и записать её в DataSet? J_>>Заранее извеняюсь за дублирование вопроса, если таковое имеет место .
S>Для ADO.NET2.0 см. DbConnection.GetSchema(...). Будут вам и индексы и форин-кеи и прочее.
Рановато я написал ответ ... GetSchema получает только первичные и уникальные ключи. Сколько не пытался, у меня не получилось получить FOREIGN KEYS... Если не сложно, напишите примерчик пожалуйста.
И ещё...
Может быть эту выборку проще сделать каким нибудь SQL запросом?
Помогите решить проблему, уж очень хочется разобраться. Заранее благодарен.
Здравствуйте, Jurik_, Вы писали:
B>>>>В крайнем случае первичные ключи достаются. Но я юзал для одной таблицы — для всей БД не тестил. J_>>>Ключи действительно достать не так сложно, но вот что делать со связями ума не приложу... _FR>>Врукопашную из таблицы IndexColumns схемы. J_>Что за таблица IndexColumns? Где она содержится?
Это я наврал Из схемы, получаемой методом DbConnection.GetSchema(…) информацию о внешних ключах, к сожелению, не вытащить .
Таблицы, столбцы и первичные ключи можно получить так, как здесь
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 });
}
>Врукопашную из таблицы IndexColumns схемы.<
ИМХО разбируть сист таблицы себе копать яму. Есть же рекомендуемый гуманный способ использовать вьюшки INFORMATION_SCHEMA, там можно собрать практически всю информацию и связях в том числе. Смотрим фак http://www.gotdotnet.ru/DotNet/FAQ/DataWorks/MSSQLDesignNDev/60355.aspx
А если уж совсем по взрослому: смотрим Microsoft.SqlServer.Management.Smo в FW2 и радуемся жизни
Здравствуйте, 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: После того, как вопрос задан... не поленитесь поставить отвечавшему оценку!>>
Здравствуйте, 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.
Здравствуйте, _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 то из кода моего первого поста
мы узнаем, что у второй в принципе есть форин-кей с именем 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: После того, как вопрос задан... не поленитесь поставить отвечавшему оценку!>>