Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Концептуальный вопрос. Как верно начать? Клиент под Access на С#. / 25 сообщений из 48, страница 1 из 2
09.11.2004, 09:46
    #32772851
Чугунок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
У меня несколько вопросов к гуру , чтобы правильно начать и спроектировать приложение, иначе потом столько будем много проблем.

Итак, есть файл mdb с 19 таблицами. Между таблицами в базе access определено много связей. Структура базы опеределена и меняться не будет. В приложении в частности будут производиться стандартные действия по добавлению , изменению , удалению записей из таблиц , поиску записей , выполнение запросов на выборку и в связи с этим вот такие вот вопросы.

1. Как поступить с DataSet . Сколько их надо сделать. У меня пока один ДатаСет и вот скажем я в него выкачиваю все таблицы базы.

В итоге получаю ДатаСет , с таблицами которого можно работать в любой форме.

Вот теперь думаю о следующем.

Поскольку в базе определены связи м/у таблицами то наверное придется добавлять связи и в ДатаСете, если не ошибаюсь это Constraint... Так вот как определить в своем ДатаСете эти связи?


Сл подводный камень.

Как поступить с сохранением данных в базу?

Юзер будет менять данные в куче таблиц ДатаСета и может сделать кнопку которая будет обновлять сразу все внесенные изменения по всем таблицам в базу? Или поступить наоборот. Каждый раз когда юзер будет вносить изменения, открывать заново коннект и вносить изменения в базу?

Теперь касательно изменения записей. Будет куча форм в котором будут производиться однотипные действия только над данными разных таблиц (удаление, апдейт , добавление записей).
Может соорудить класс который будет как бы универсальным для выполнения этих действий? А потом его и применять в формах . Но ведь кол-во полей в таблицах разное и типы полей разные. Тут у меня опыта маловато.

Есть еще вопрос важный.

Как получить имена всех таблиц и имена всех полей в mdb файле? Зная это я думаю написал бы класс для работы с записями таблиц.


Был бы очень рад за любую помощь и советы по данному вопросу. Ведь главное правильно начать.
...
Рейтинг: 0 / 0
09.11.2004, 10:52
    #32772971
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
...
Рейтинг: 0 / 0
09.11.2004, 10:56
    #32772985
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
авторКак получить имена всех таблиц и имена всех полей в mdb файле? Зная это я думаю написал бы класс для работы с записями таблиц.

Посмотрите в сторону DataAdapter.FillSchema.
...
Рейтинг: 0 / 0
09.11.2004, 10:59
    #32772991
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
Так вот как определить в своем ДатаСете эти связи?добавляй relation'ы в DataSet - DataSet.Relations.Add(..); Как получить имена всех таблиц и имена всех полей в mdb файле? OleDbConnection.GetOleDbSchemaTable(..);
...
Рейтинг: 0 / 0
09.11.2004, 11:03
    #32773004
Чунунок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
//Посмотрите в сторону DataAdapter.FillSchema.

Уважаемый hDrummer, а нельзя чуть подробней об этом . DaAdapter - это мост между ДатаСетом и самой базой. Как его использовать для получения имен всех таблиц базы и имен полей в таблицах?
...
Рейтинг: 0 / 0
09.11.2004, 11:04
    #32773007
Mr. GES
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
пример моего класса - редактора таблиц
в качестве свойств прнимает dataset, набор комманд и Dataadapter для
осуществления обновлений в таблице
также релизован поиск по любому строковому полю датасета ..
...
Рейтинг: 0 / 0
09.11.2004, 11:08
    #32773021
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
Чунунок//Посмотрите в сторону DataAdapter.FillSchema.

Уважаемый hDrummer, а нельзя чуть подробней об этом . DaAdapter - это мост между ДатаСетом и самой базой. Как его использовать для получения имен всех таблиц базы и имен полей в таблицах?

кузя более точен - OleDbConnection.GetOleDbSchemaTable(..)
подробнее использование см. в SDK или MSDN.
...
Рейтинг: 0 / 0
09.11.2004, 11:13
    #32773035
Чугунок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
2 Mr. GES

Спасибо , качнул и смотрю. В аське то бываешь?

2 hDrummer

Ага.

Спасибо All, зарываюсь в работу.

Сейчас определю связи между таблицами. Я уже понял , что это должен быть всего лишь один ДатаСет.
...
Рейтинг: 0 / 0
09.11.2004, 11:33
    #32773088
Чугунок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
Блин, нуна хорошая книжка по ADO.NET

Вот есть в доке на NET такой пример


C# Copy Code

public DataTable GetTables(OleDbConnection conn)
{
conn.Open();
DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
new object[] {null, null, null, "TABLE"});
conn.Close();
return schemaTable;
}

Как отсюда вытащить имена таблиц абсолютно не рублю, а про имена столбцов тоже бы надо.
...
Рейтинг: 0 / 0
09.11.2004, 11:40
    #32773103
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
MSDNEach field in the OleDbSchemaGuid class maps to an OLE DB schema rowset. For more information, see "Appendix B: Schema Rowsets," in the OLE DB Programmer’s Reference.
...
Рейтинг: 0 / 0
09.11.2004, 13:02
    #32773384
Чугунок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
Я так понял метод вернет DataTable в которой будет вся информация о базе и ее таблицах полях и прочей ботве.

А эту таблицу можно добавить в DataSet? Чтобы в гриде посмотреть?
...
Рейтинг: 0 / 0
09.11.2004, 13:05
    #32773396
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
да
давно б уже добавил и посмотрел :)
...
Рейтинг: 0 / 0
09.11.2004, 13:08
    #32773406
Чугунок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
Кузя !

Это почему что не работает?

this.TotalDataSet.Tables.Add(schemaTable);

Потом обращаюсь в 20 таблице получаю хрен..Что мол нет у тебя такой таблицы...

Не пашет.

Говорил мне ПАПА, слезай на .NET и побыстрей .
...
Рейтинг: 0 / 0
09.11.2004, 13:17
    #32773428
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
не пахало бы, словил бы exception по null reference :)
за 20-ю таблицу ничего сказать не могу, т.к. не знаю сколько их тебя вообще.

смотри "в лоб"
DataGrid.SetDataBinding(schemaTable, null);
...
Рейтинг: 0 / 0
09.11.2004, 13:21
    #32773440
Чугунок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
Есть , пашет , кузя спасибо.

this.TotalDataSet.Tables.Add(schemaTable);

Это пошло, просто я идиот тут тупанул немного.

Грид выводит имена таблиц в базе mdb и прочую инфу. Теперь осталось имена столбцов каждой таблицы взять... как? Чешу репу!
...
Рейтинг: 0 / 0
09.11.2004, 13:29
    #32773466
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
OleDbSchemaGuid.Columns

restrictions: TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME

по всем таблицам все колонки
Код: plaintext
oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] {null, null, null, null});
...
Рейтинг: 0 / 0
09.11.2004, 13:35
    #32773481
Чугунок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
Действую.
...
Рейтинг: 0 / 0
09.11.2004, 13:40
    #32773498
Чугунок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
Получилось!

public DataTable GetAllColumn()
{


DataTable schemaTable1 = Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns ,
new object[] { null, null, null,null });

this.TotalDataSet.Tables.Add(schemaTable1);

return schemaTable1;

}

Только он собака серая еще берет поля запросов... Нельзя ли только таблиц?
...
Рейтинг: 0 / 0
09.11.2004, 13:46
    #32773513
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
либо все (как сейчас),
либо в цикле по именам таблиц формируй эту DataTable
...
Рейтинг: 0 / 0
09.11.2004, 13:55
    #32773546
Чугунок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
Имеешь ввиду завести новую DataTable и пихать туда строки в цикле по таблице где есть все?
...
Рейтинг: 0 / 0
09.11.2004, 13:59
    #32773559
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
или наоборот - прочитать все а потом удалить ненужное :)
...
Рейтинг: 0 / 0
09.11.2004, 14:27
    #32773645
Чугунок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
Ты прав Кузя , удалить ненужное будет проще. А как организовать удаление по определенному критерию в DataTable?
Надо в цикле смотреть, не равно ли поле TABLE_NAME имени таблицы (которые уже у меня в массиве) . Даже незнаю как это осуществить пока.

Кстати вот что у меня получилось, это так пока набросок



// класс выдирает все таблицы базы данных и заполняет DataSet данными
public class GetAllTables
{
const string FROM = "SELECT * FROM ";
public DataSet TotalDataSet;
OleDbDataAdapter Adapter;
OleDbCommand Command;
OleDbConnection Connection;
string[] NameAllTables; // в массиве храним имена всех таблиц базы

//================================================================================================================
public GetAllTables() // открываем коннект и пихаем в доступный датасет данные всех таблиц базы
{
Connection = new OleDbConnection();
Connection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + @"\fuckDB.mdb";
Connection.Open();


TotalDataSet = new DataSet();
Command = new OleDbCommand();
Adapter = new OleDbDataAdapter();
Command.Connection = Connection;

GetNameAllTables();

for (int i = 0; i < NameAllTables.Length; i++)
{
Command.CommandText = FROM + NameAllTables ;
Adapter.SelectCommand = Command;
Adapter.Fill(TotalDataSet, Command.CommandText);
}

GetAllColumn();



//Connection.Close(); // закрываем коннект
}

// метод получает имена всех таблиц базы и создает новую таблицу в //DataSet

private void GetNameAllTables()
{
// Connection.Open();

DataTable schemaTable = Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
new object[] { null, null, null, "TABLE" });

this.TotalDataSet.Tables.Add(schemaTable);

// пихаем имена таблиц в массив из полученной таблицы

NameAllTables = new string[this.TotalDataSet.Tables[0].Rows.Count];

for (int i = 0; i < NameAllTables.Length; i++)
{
NameAllTables = Convert.ToString( this.TotalDataSet.Tables[0].Rows[2]);
}


}

private void GetAllColumn()
{

DataTable schemaTable1 = Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns ,
new object[] { null, null, null,null });
this.TotalDataSet.Tables.Add(schemaTable1);

}



}

Здесь пока работает на ура. Могу в гриде смотреть и таблицы где имена таблиц / таблиц с полями и собственно сами таблицы.

Вот теперь как отсеять эти ненужные записи в таблице 20 DataSet...
...
Рейтинг: 0 / 0
09.11.2004, 14:47
    #32773706
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
примерно так:
0-я DataTable - имена таблиц
1-я DataTable - имена котлонок
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ds.Tables.Add(cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[]{null, null, null, "TABLE"}));
ds.Tables.Add(cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[]{null, null, null, null}));
			
DataView dt=new DataView(ds.Tables[0]); // OleDbSchemaGuid.Tables
for(int i=0; i<ds.Tables[1].Rows.Count; i++)
{ dt.RowFilter="TABLE_NAME='"+ds.Tables[1].Rows[i]["TABLE_NAME"]+"'";
  if(dt.Count<1) 
    ds.Tables[1].Rows[i].Delete();
}
ds.AcceptChanges();
...
Рейтинг: 0 / 0
09.11.2004, 15:17
    #32773783
Чугунок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
Кузе

А я тут взял два вложенных цикла , вот ... Внешний цикл бежит по записям таблицы где есть все барахло , а внутренний достает имена таблиц из массива. По идее если в таблице 20 той третье поле не совпадает с названием таблицы я грохаю строку, но среда ругается и вот как

Deleted row information cannot be accessed through the row.

И тыкает в строку где у меня вилка if
Что же за пакост, ведь вроде все верно делаю. Имена таблиц во второй таблице во втором столбце (с нуля)... Что я тут начудил?


public void Del()
{
int i1=this.TotalDataSet.Tables[20].Rows.Count ;

for (int j=0;j<NameAllTables.Length;j++)


{

for (int i=0;i<i1;i++)

{
if (NameAllTables[j] != Convert.ToString(this.TotalDataSet.Tables[20].Rows [2]))
this.TotalDataSet.Tables[20].Rows.Delete();
}

}

this.TotalDataSet.AcceptChanges();

}
...
Рейтинг: 0 / 0
09.11.2004, 15:24
    #32773798
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
перепиши свой пример и используй SRC тэг (7-слева) для исх. текста на C# - блин, половина индексов ушли на италик.

перепиши - в смысле еще раз выложи здесь, но уже в красивом виде :)
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Концептуальный вопрос. Как верно начать? Клиент под Access на С#. / 25 сообщений из 48, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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