Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как анализировать структуру Базы данных. MS Access DB .mdb файл 
V
    Опции темы
bytes
Дата 24.5.2008, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.10.2006
Где: Baku

Репутация: нет
Всего: нет



У меня мини проект. Базы данных MS Access.
Там надо менять Базы данных, подключать другой  .mdb файл.
И хочу анализировать структуру .mdb:  потом не была проьлема с работой программы.
сколько и  какие таблиц, какие стольбцы итак далее. 
--------------------
?==! or !==?
PM MAIL ICQ MSN   Вверх
Rififi
Дата 24.5.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: нет
Всего: 36



получить информацию о таблицах можно либо через интерфейс ADOX (напрямую не поддерживается в .NET, нужно использовать COM-враппер), либо через Table Schema:
Код
OleDbConnection connection = ...
DataTable schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] {null, null, null, "TABLE"});

подробности найдёшь в msdn
PM MAIL   Вверх
bytes
Дата 24.5.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.10.2006
Где: Baku

Репутация: нет
Всего: нет



ok. спосибо. посмотрим...
--------------------
?==! or !==?
PM MAIL ICQ MSN   Вверх
bytes
Дата 24.5.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.10.2006
Где: Baku

Репутация: нет
Всего: нет



насколько я понял GetOleDbSchemaTable анализирует таблицу по стольбцам.
сколько и  какие таблиц ?
С OleDbDataAdapter - ом не получилось, поможешь?

Это сообщение отредактировал(а) bytes - 24.5.2008, 11:45
--------------------
?==! or !==?
PM MAIL ICQ MSN   Вверх
Chef
Дата 24.5.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 7.12.2007
Где: РК Павлодар

Репутация: нет
Всего: нет



Код

OleDbDataReader rd = null;
DataTable res = null;
string sql = "SELECT * FROM " + sTablName + " where 1=0";

cmd.CommandText = sql;
con.Open();
rd = cmd.ExecuteReader(CommandBehavior.KeyInfo);
res = rd.GetSchemaTable();
con.Close();


в табдице res будет полная схема нужной таблицы

Код

CommandBehavior.KeyInfo

Для того что бы выдала инфу по полям

Это сообщение отредактировал(а) Chef - 24.5.2008, 11:51
--------------------
Разговоры об IT
PM MAIL WWW   Вверх
bytes
Дата 24.5.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.10.2006
Где: Baku

Репутация: нет
Всего: нет



нее...
есть .mdb файл. я хочу анализировать - знать сколько таблиц там, какие они...
а потом уже анализировать каждую таблицу по своим стольбцом.

Добавлено через 2 минуты и 26 секунд
если работает то и так возможно. но тестировать надо ...
--------------------
?==! or !==?
PM MAIL ICQ MSN   Вверх
Chef
Дата 24.5.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 7.12.2007
Где: РК Павлодар

Репутация: нет
Всего: нет



Список таблиц

Код

con.Open();
 DataTable DT = this.con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
                                  new object[] { null, null, null, "TABLE" });
            con.Close();
            tbName = new string[DT.Rows.Count];
            int i = 0;
            foreach (DataRow row in DT.Rows)
            {
                tbName[i] = row[DT.Columns[2]].ToString();
                i++;
            }


tblName[] - все таблицы там

Это сообщение отредактировал(а) Chef - 24.5.2008, 12:11
--------------------
Разговоры об IT
PM MAIL WWW   Вверх
bytes
Дата 24.5.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.10.2006
Где: Baku

Репутация: нет
Всего: нет



Код

            OleDbConnection con = new OleDbConnection("provider=Microsoft.JET.OLEDB.4.0; data source=MarketVB.mdb");
            con.Open();

            OleDbDataReader rd = null;
            DataTable res = null;
            OleDbCommand cmd = new OleDbCommand();
            string sql = "SELECT * FROM Users where 1=0";

            cmd.Connection = con;
            cmd.CommandText = sql;
            rd = cmd.ExecuteReader(CommandBehavior.KeyInfo);
            res = rd.GetSchemaTable();

            for (int i = 0; i < res.Columns.Count; i++ )
            {
                textBox1.Text += res.Columns[i].ColumnName + "\r\n";
            }


Результат:
Код

ColumnName
ColumnOrdinal
ColumnSize
NumericPrecision
NumericScale
DataType

Что то не поняль, называния стольбцов... ?

Это сообщение отредактировал(а) bytes - 24.5.2008, 12:32
--------------------
?==! or !==?
PM MAIL ICQ MSN   Вверх
Chef
Дата 24.5.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 7.12.2007
Где: РК Павлодар

Репутация: нет
Всего: нет



bytes 
Едрен батон, читай что я к коду пишу.
Тот кусок кода который ты мне показал, это схема таблицы.

Вот этот код возратит имена всех таблиц
Код

con.Open();
DataTable DT = this.con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
                                  new object[] { null, null, null, "TABLE" });
            con.Close();
            tbName = new string[DT.Rows.Count];
            int i = 0;
            foreach (DataRow row in DT.Rows)
            {
                tbName[i] = row[DT.Columns[2]].ToString();
                i++;
            }

Полезно просматривать данные в дебаге, там можно посмотреть структуру возращаемой таблицы




Это сообщение отредактировал(а) Chef - 24.5.2008, 13:08
--------------------
Разговоры об IT
PM MAIL WWW   Вверх
bytes
Дата 24.5.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.10.2006
Где: Baku

Репутация: нет
Всего: нет



Цитата(Chef @ 24.5.2008,  13:04)
bytes 
Едрен батон, читай что я к коду пишу.
Тот кусок кода который ты мне показал, это схема таблицы.

Вот этот код возратит имена всех таблиц
Код

con.Open();
DataTable DT = this.con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
                                  new object[] { null, null, null, "TABLE" });
            con.Close();
            tbName = new string[DT.Rows.Count];
            int i = 0;
            foreach (DataRow row in DT.Rows)
            {
                tbName[i] = row[DT.Columns[2]].ToString();
                i++;
            }

Полезно просматривать данные в дебаге, там можно посмотреть структуру возращаемой таблицы

Ок это работает. Имена стольбец как узнать?
Код

            OleDbConnection con = new OleDbConnection("provider=Microsoft.JET.OLEDB.4.0; data source=MarketVB.mdb");
            con.Open();

            OleDbDataReader rd = null;
            DataTable res = null;
            OleDbCommand cmd = new OleDbCommand();
            string sql = "SELECT * FROM Users where 1=0";

            cmd.Connection = con;
            cmd.CommandText = sql;
            rd = cmd.ExecuteReader(CommandBehavior.KeyInfo);
            res = rd.GetSchemaTable();

            for (int i = 0; i < res.Columns.Count; i++ )
            {
                textBox1.Text += res.Columns[i].ColumnName + "\r\n";
            }

не правильно работает smile 
--------------------
?==! or !==?
PM MAIL ICQ MSN   Вверх
Chef
Дата 24.5.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 7.12.2007
Где: РК Павлодар

Репутация: нет
Всего: нет



Вот это будет работать
Код

 DataTable res;
........
 rd = cmd.ExecuteReader(CommandBehavior.KeyInfo);
 res = rd.GetSchemaTable();
.......

foreach( DataRow dr in res.Rows )
{
   textBox1.Text += dr["Имя нужной колонки"] + "\r\n";
}

Колонки посмотри сам.... я их не помню
--------------------
Разговоры об IT
PM MAIL WWW   Вверх
bytes
Дата 24.5.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.10.2006
Где: Baku

Репутация: нет
Всего: нет



Chef, я хочу выяснить какие колонки есть в этом и другом таблице.
Не то что читая все записи узнать занчение какой либо колонки.
не значение,  а имена и типы колонок
--------------------
?==! or !==?
PM MAIL ICQ MSN   Вверх
Chef
Дата 25.5.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 7.12.2007
Где: РК Павлодар

Репутация: нет
Всего: нет



В полученной таблице все есть.....
Я так понял, как просмотреть значения в полученной таблице во время выполнения ты не знаешь....

Поставь брейкпоитн в месте получения таблицы (нажми F9), 
F10 - выполнить след команду, без просмотра ее выполнения
F11 - с просмотром

На картинке красная линия  брейкпоинт
Желтая - текущая команда, которую выполняет программа
user posted image
Путем нажимания F10 проходим момент заполнения таблицы, наводим мышкой на  имя переменной, нашей таблицы, выходит маленькая панелька, там есть плюсик, если нажмешь на него то увидешь, много полезного.... Но нам нужна картинка лупы что правее...... щелкаем на ее и видим таблицу и все ее поля, колонки......
user posted image
А вот собственно и сама таблица
user posted image
Как использовать полученые имена колонок:
Код

object obj =  DataTable.rows[i]["Имя колонки"]






--------------------
Разговоры об IT
PM MAIL WWW   Вверх
bytes
Дата 25.5.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.10.2006
Где: Baku

Репутация: нет
Всего: нет



Ok. All right! Thanks, Chef
--------------------
?==! or !==?
PM MAIL ICQ MSN   Вверх
Chef
Дата 25.5.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 7.12.2007
Где: РК Павлодар

Репутация: нет
Всего: нет



Всегда рад помочь  smile 
--------------------
Разговоры об IT
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0819 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.