|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
У меня несколько вопросов к гуру , чтобы правильно начать и спроектировать приложение, иначе потом столько будем много проблем. Итак, есть файл mdb с 19 таблицами. Между таблицами в базе access определено много связей. Структура базы опеределена и меняться не будет. В приложении в частности будут производиться стандартные действия по добавлению , изменению , удалению записей из таблиц , поиску записей , выполнение запросов на выборку и в связи с этим вот такие вот вопросы. 1. Как поступить с DataSet . Сколько их надо сделать. У меня пока один ДатаСет и вот скажем я в него выкачиваю все таблицы базы. В итоге получаю ДатаСет , с таблицами которого можно работать в любой форме. Вот теперь думаю о следующем. Поскольку в базе определены связи м/у таблицами то наверное придется добавлять связи и в ДатаСете, если не ошибаюсь это Constraint... Так вот как определить в своем ДатаСете эти связи? Сл подводный камень. Как поступить с сохранением данных в базу? Юзер будет менять данные в куче таблиц ДатаСета и может сделать кнопку которая будет обновлять сразу все внесенные изменения по всем таблицам в базу? Или поступить наоборот. Каждый раз когда юзер будет вносить изменения, открывать заново коннект и вносить изменения в базу? Теперь касательно изменения записей. Будет куча форм в котором будут производиться однотипные действия только над данными разных таблиц (удаление, апдейт , добавление записей). Может соорудить класс который будет как бы универсальным для выполнения этих действий? А потом его и применять в формах . Но ведь кол-во полей в таблицах разное и типы полей разные. Тут у меня опыта маловато. Есть еще вопрос важный. Как получить имена всех таблиц и имена всех полей в mdb файле? Зная это я думаю написал бы класс для работы с записями таблиц. Был бы очень рад за любую помощь и советы по данному вопросу. Ведь главное правильно начать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 09:46 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 10:52 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
авторКак получить имена всех таблиц и имена всех полей в mdb файле? Зная это я думаю написал бы класс для работы с записями таблиц. Посмотрите в сторону DataAdapter.FillSchema. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 10:56 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Так вот как определить в своем ДатаСете эти связи?добавляй relation'ы в DataSet - DataSet.Relations.Add(..); Как получить имена всех таблиц и имена всех полей в mdb файле? OleDbConnection.GetOleDbSchemaTable(..); ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 10:59 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
//Посмотрите в сторону DataAdapter.FillSchema. Уважаемый hDrummer, а нельзя чуть подробней об этом . DaAdapter - это мост между ДатаСетом и самой базой. Как его использовать для получения имен всех таблиц базы и имен полей в таблицах? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 11:03 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
пример моего класса - редактора таблиц в качестве свойств прнимает dataset, набор комманд и Dataadapter для осуществления обновлений в таблице также релизован поиск по любому строковому полю датасета .. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 11:04 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Чунунок//Посмотрите в сторону DataAdapter.FillSchema. Уважаемый hDrummer, а нельзя чуть подробней об этом . DaAdapter - это мост между ДатаСетом и самой базой. Как его использовать для получения имен всех таблиц базы и имен полей в таблицах? кузя более точен - OleDbConnection.GetOleDbSchemaTable(..) подробнее использование см. в SDK или MSDN. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 11:08 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
2 Mr. GES Спасибо , качнул и смотрю. В аське то бываешь? 2 hDrummer Ага. Спасибо All, зарываюсь в работу. Сейчас определю связи между таблицами. Я уже понял , что это должен быть всего лишь один ДатаСет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 11:13 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Блин, нуна хорошая книжка по 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; } Как отсюда вытащить имена таблиц абсолютно не рублю, а про имена столбцов тоже бы надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 11:33 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 11:40 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Я так понял метод вернет DataTable в которой будет вся информация о базе и ее таблицах полях и прочей ботве. А эту таблицу можно добавить в DataSet? Чтобы в гриде посмотреть? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 13:02 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
да давно б уже добавил и посмотрел :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 13:05 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Кузя ! Это почему что не работает? this.TotalDataSet.Tables.Add(schemaTable); Потом обращаюсь в 20 таблице получаю хрен..Что мол нет у тебя такой таблицы... Не пашет. Говорил мне ПАПА, слезай на .NET и побыстрей . ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 13:08 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
не пахало бы, словил бы exception по null reference :) за 20-ю таблицу ничего сказать не могу, т.к. не знаю сколько их тебя вообще. смотри "в лоб" DataGrid.SetDataBinding(schemaTable, null); ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 13:17 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Есть , пашет , кузя спасибо. this.TotalDataSet.Tables.Add(schemaTable); Это пошло, просто я идиот тут тупанул немного. Грид выводит имена таблиц в базе mdb и прочую инфу. Теперь осталось имена столбцов каждой таблицы взять... как? Чешу репу! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 13:21 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
OleDbSchemaGuid.Columns restrictions: TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME по всем таблицам все колонки Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 13:29 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Действую. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 13:35 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Получилось! public DataTable GetAllColumn() { DataTable schemaTable1 = Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns , new object[] { null, null, null,null }); this.TotalDataSet.Tables.Add(schemaTable1); return schemaTable1; } Только он собака серая еще берет поля запросов... Нельзя ли только таблиц? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 13:40 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
либо все (как сейчас), либо в цикле по именам таблиц формируй эту DataTable ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 13:46 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Имеешь ввиду завести новую DataTable и пихать туда строки в цикле по таблице где есть все? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 13:55 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
или наоборот - прочитать все а потом удалить ненужное :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 13:59 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Ты прав Кузя , удалить ненужное будет проще. А как организовать удаление по определенному критерию в 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... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 14:27 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
примерно так: 0-я DataTable - имена таблиц 1-я DataTable - имена котлонок Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 14:47 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Кузе А я тут взял два вложенных цикла , вот ... Внешний цикл бежит по записям таблицы где есть все барахло , а внутренний достает имена таблиц из массива. По идее если в таблице 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(); } ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 15:17 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
перепиши свой пример и используй SRC тэг (7-слева) для исх. текста на C# - блин, половина индексов ушли на италик. перепиши - в смысле еще раз выложи здесь, но уже в красивом виде :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 15:24 |
|
|
start [/forum/topic.php?fid=17&msg=32772851&tid=1353950]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 205ms |
0 / 0 |