|
Концептуальный вопрос. Как верно начать? Клиент под 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 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
вот Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 15:30 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
бл* , удаляю уже удаленную строку... Крышняк едет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 15:52 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
а ты в отладчике это проходил ? у тебя же одна и таже запись 20 раз удаляется. но ведь не дают, потому как это доступно всего один раз :) после этого строка переходит в состояние удаленных и доступ к ее полям только через origin имхо сделй через DataView, гиморроя меньше ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 15:58 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Я понял уже . Щас через ДатаВью сделаем... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 16:00 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
бл*, какой я дурак. Ведь имена полей таблицы можно получить по ней самой из датасета... аааааЁЁЁЁ... Кузя, спасибо тебе, повозился со мной дураком. Сейчас создам невыровненный модный массив и туды пихну названия всех полей. Пасиб ещо раз !! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 16:27 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Создаю связь один ко многим в датасете вот код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
ругань на это место relCustOrder = new DataRelation("WrkData_Otpusk", parentCol, childCol); Почему? Чот не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2004, 10:07 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Да кстати , вот текст ругани ... Object reference not set to an instance of an object. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2004, 10:13 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Чугунокругань на это местоесли не содержит ненормативной лексики, то приведи текст ругани... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2004, 10:14 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
проверь на null parentCol и childCol ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2004, 10:20 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
В режиме останова свойства table колумнов = null ? Все имена верно указаны... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2004, 10:40 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
поставил индексы таблиц и колумнов в них и заработало... Но у а чо по именам то не хочет? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2004, 10:48 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
имя неверно записал (типа, синтаксическая ошибка) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2004, 10:56 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
очень частая ошибка: есть 2 (два) отличия в написании слова: "name" и "nаmе" на глаз не видно, но первое слово записано только латинскими буквами, а во втором слове - две русские буквы: 'а' и 'е'. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2004, 11:17 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Кузя , привет. Иди сюды пжлста... Есть тут грабли... Я применяю OleDbCommandBuilder для сохранения данных в таблицах базы после правки в датагриде... И прикол заключается вот в чем! Для 19 таблиц все нормально работает! А вот для одной он вываливает вот это дерьмо Ошибка синтаксиса (пропущен оператор) в выражении запроса '((код = ?) AND ((? = 1 AND сокр IS NULL) OR (сокр = ?)) AND ((? = 1 AND prem_den IS NULL) OR (prem_den = ?)) AND ((? = 1 AND prem_smen IS NULL) OR (prem_smen = ?)) AND ((? = 1 AND категория IS NULL) OR (категория = ?)) AND ((? = 1 AND 0р IS NULL) OR (0р ='. Для других таблиц тот же код проходит на ура... Вот это кстати Код: plaintext 1. 2. 3.
Ключ первичный в этой таблице есть... Всякой швали типа значение по умолчанию или условие на значение ни у одного поля нет...Таблица как таблица ... Что за ботва , не пойму... Для других таблиц этот же код работает ,а для этой, короче закопался ... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2004, 12:02 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
есть подозрение, что имя поля 0р начинается с цифры. или разубеди что это не так, или ставь QuotePrefix/QuoteSuffix в билдере. --- Что за ботва , не пойму (с) Чугун и Чугунок - сколько вас ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2004, 12:25 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
ай да красавец кузя... ай маладца... ТОЧНО, поля в натуре начинались с цифры. исправил и все забегало... Чугун и чугунок это я бедный и несчастный программер... А вот ты маладес!!! А вот жму я тебе руку!!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2004, 12:33 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Как мне забиндить текстовое поле? Ну например на форме есть куча полей и правя в них значения изменения тут же пишутся в базу. Как это организовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2004, 11:02 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
модель работы с данными не та. изменения пишутся в БД только по запросам типа dataAdapter.Update или через команды для connection'a. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2004, 13:41 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Но тогда зачем биндинг сделан? Ведь можно держать соединение постоянно. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2004, 13:44 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
binding - для данных в твоей программе. и работа с БД - твоя головная боль - когда данные в программе синхронизовать с данными в БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2004, 13:57 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
Ясно. А как тогда забиндить текстбокс с полем таблицы ДатаСета? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2004, 14:16 |
|
Концептуальный вопрос. Как верно начать? Клиент под Access на С#.
|
|||
---|---|---|---|
#18+
что нибудь из этого (способов много): this.textBox1.DataBindings.Add("Text", dataSet, "имя_таблицы.имя_столбца"); this.textBox1.DataBindings.Add("Text", dataTable, "имя_столбца"); ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2004, 14:21 |
|
|
start [/forum/topic.php?all=1&fid=17&tid=1353950]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
67ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
others: | 9ms |
total: | 183ms |
0 / 0 |