![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 2 Всего: 44 |
Люди, товарищи, человеки!
Какие ест подходы к базам в .Net. Через какие классы, службы и т.д. Есдит можно ссылочку на хорошую доку с примерами. Если можно ориентированно на visulStudio .Net и C# -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
А что за тип БД ? Для SQL Server в .NET есть набор классов начиная с SqlConnection, для "просто ADO" есть OleDbConnection и т.п.
А вообще, имхо, лучше всего начать с общих принципов работы с датасетами, таблицами и т.п. - например просмотреть классы DataSet, DataTable, DataRow. Методы работы с ними ОЧЕНЬ похожи на работу с обычными массивами, так что усвоить будет легко. А конкретизированные классы для работы с ADO/SQLServer и т.п. в конце концов сводятся к датасету, так что вот... ![]() -------------------- ![]() |
|||
|
||||
Kurt |
|
||||||||||||||||||||
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: 20 Всего: 36 |
Для работы с базами данных в .NET разработана новая технология ADO.NET. Хочется отметить, что, несмотря на вызывающее асоциации название, она не является расширением классического ADO. Это ИНАЯ модель. Не буду говорить лучше или хуже, здесь судит каждый сам, пусть будет "иная".
![]() ADO.NET ориентирована на построение рассоединенных (diconnected) систем на .NET-платформе. Суть рассоединенных систем заключается в следующем: исходя из того, что часто требуется минимизировать нагрузку на сеть, на стороне пользователя создается какбы локальная копия базы данных, что хранится на сервере. Клиент изменяет этот локальных набор данных и лишь после коммита он отправляется на сервер (естественно, отправляется не все, а лишь изменения). Уже здесь видно отличие - классическая ADO рассчитана на клиент-серверные приложения, т.е. когда клиент и сервер постоянно взаимодействуют друг с другом, тем самым нагружая сеть. Конечно, ADO.NET тоже далеко не идеальна - например, набор данных, с которыми работает пользователь, может устареть (кто-нибудь другой изменил данные), однако, это все решается. ![]() Еще одно интересное решение в ADO.NET это то, что здесь реализована поддержка представления данных в XML-форматах. Что дает возможность переправлять данные через родной и всеми любимый HTTP - следовательно, отпадают проблемы с фаерволами. Итак, какие задачи решают типы ADO.NET? 1) Установить соединение; 2) Создать локальную копию данных; (для этого применяется класа DataSet) 3) Отключиться от сервера; 4) Вернуть изменения на сервер. Т.о. в центре внимания находится класс DataSet - локальный набор таблиц и информации об отношениях между ними. Это некий RecordSet из классического ADO, различия в том, что RecordSet хранит только одну таблицу, а DataSet - фактически полную копию всей базы. Как только создан и заполнен объект класса DataSet, к нему допустимы все операции, что и с обычными базами - добавлять/удалять записи, ставить фильтры и т.п. Когда все изменения будут закончены, информация будет отправлена на сервер. DataSet создается при помощи т.н. управляемого провайдера (managed provider) - набора классов, реализующих интерфейсы доступа к базе. В состав .NET-Framework 1.1 входят два провайдера: OleDb-провайдер (для хранилищ данных, к-е поддерживают формат OleDb) и SQL-провайдер (спец. адаптирован для работы с MSSQL Server 7.0 и выше). Т.е. ситуация такая: по возможности используется специализированный провайдер, позволяющий наиболее эффективно работать с конкретной СУБД. Если такого провайдера нет - используют OleDb. Т.к. в OleDb выполняется куча преобразований в формат OleDb, то этот способ медленнее, чем спец. провайдеры. На даный момент большинство фирм производителей СУБД стараются выпустить адаптированный провайдер. Так, выпустили или во всяком случае собираются выпустить провайдеры под MySQL (точно знаю, что выпущен..), Oracle, Cache, Postgres etc. Все типы ADO.NET содержатся в namespace System.Data, расположенном в сборке System.Data.dll. Любой ADO.NET-проект должен содержать ссылку на эту сборку. Кроме того, нужен будет тот или иной провайдер. "Стандартные" провайдеры содержатся в namespace'ах System.Data.SQL и System.Data.OleDb соответственно для SQL- и OleDb-провайдера. Если используется сборка третьей фирмы - нужно тоже ее подключить (как в случае с MySQL). Пространство имен System.Data содержит много типов, обеспечивающих работу с БД, но самыми основными являются: 1) DataSet; (локальная копия данных. Состоит из множества объектов DataTable, а также информацию об отношениями между ними) 2) DataTable; (представляет собой одну конкретную таблицу) 3) DataColumn; (столбец в объекте DataTable) 4) DataRow; (строка в объекте DataTable); DataColumn(с него проще начать) Как уже упоминалось, это отдельный столбец в таблице. Он содержит поля, определяющие характеристики данного столбца в таблице. Например, Caption (заголовок столбца), DataType (тип), AutoIncrement (для настройки автоинкремента) и д.р. Создадим столбец и добавим его в таблицу:
Или вот настроим автоинкремент:
DataRow Это одна конкретная строка таблицы. Класс содержит много интересных свойств и методов. Описывать их здесь нет особого смысла - существует куча документации на эту тему. Мне особенно понравился метод Delete() - ПОМЕТИТЬ строку как удаленную. Я специально выделил это слово - т.е. физически строка не будет удалена, пока не будет подана команда AcceptChanges() (метод этого же класса). Т.е. можно отменить удаление в любой момент (метод RejectChanges) Небольшой пример работы с этим классом:
DataTable Описывает таблицу из набора данных DataSet. Собственно, я уже использовал этот тип в примерах раньше. Повторяться не хочу, поэтому давайте сразу с примера, естественно, комментируя некоторые моменты.
Хорошо бы еще описать класс DataSet (например, как читать/сохранять данные из DataSet в XML-файлы, как реализовывать отношения между таблицами), но это уже явно перебор для одного раза. ![]() Упомяну лишь один, на мой взгляд, самый нужный метод - Add() - он добавляет таблицу в конкретный DataSet. Приблизительно, так:
С помощью вышесказанного уже можно построить вполне состоятельное приложение, к-е поддерживает все функции, кроме непосредственно сохранения в базе (ну, можно таблицы в XML-файлах посохранять). Т.е. выгрузим приложение - выгрузятся и наши данные. Вот тут-то на сцену и выходят управляемые провайдеры! Дальнейшее описание будет строиться на основе OleDb (все-таки, больше универсальности), а также на "СУБД" Access, да простят меня читающие эти строки. ![]() Сразу подключим наши namespace'ы:
Перечислим основные типы OleDb: 1) OleDbConnection; (Соединение с источником данных) 2) OleDbCommand; (Запрос к источнику данных) 3) OleDbDataAdapter; (о нем будт особо сказано ниже) 4) OleDbDataReader; (считывает данные из источника в одном направлении (только вперед)) 5) OleDbErrorCollection; (набор ошибок и предупреждений, к-е возвращает источник данных) 6) OleDbParameter; (параметр для передачи хранимой процедуре) Итак, чтобы подключиться к источнику данных используем объект класса OleDbConnection. Особенно важное св-во этого класса - ConnectionString: строка, характеризующая подключение к серверу. Например, подключимся к Access:
Естественно, для каждой СУБД свой ConnectionString. Теперь как выполнить запрос к источнику данных. Для этого, как уже было сказано, используется класс OleDbCommand. В конструкторе необходимо указать строку, содержащую SQL-запрос, а также созданное нами соединение. Чтение происходит с помощью OleDbDataReader:
Теперь уже можно написать простенького клиента к базе данных. Мы можем читать данные (правда, в одном направлении) и посылать управляющие запросы. Однако, причем здесь DataSet и все прочее? Как все-таки заполнить этот несчастный класс данными с сервера? Насколько я знаю, существует несколько способов, но самый простой и распространенный - использовать класс OleDbDataAdapter. Основная задача этого класса - автоматизация процессов редактирования, добавления и т.д. данных, однако, здесь я его расписывать не буду, упомяну лишь как заполнить DataSet. Для этого нужно создать объект класса OleDbDataAdapter на основе открытого соединения с сервером БД. Далее вызывается метод Fill, к-й автоматически и заполняет наш DataSet. Для отправления изменений используется метод Update(). Проиллюстрируем все это на примере:
........................ Думаю, пора заканчивать сей монумент. Это лишь самое начало. Здесь не затронуты вопросы хранимых процедур, работы с XML и т.д. Но это лучше в другой раз. Хочу заметить, что если вы замените "OleDb" в названиях классов на "Sql" или "ODBC", то получите соответсвенно классы для работы с MS SQL Server и ODBC. Надеюсь, это в какой-то степени является ликбезом в области ADO.NET и поможет вам в разработке .NET-приложений. Сейчас 4-е часа ночи, поэтому допускаю, что тут сделано куча ошибок и описок, кроме того, здесь рассказано как Я представляю себе ADO.NET, поэтому буду рад любым поправкам (можно через PM). ![]() Если есть необходимость продолжить - пишите, что следует раскрыть подробнее. З.Ы. Для того, чтобы отобразить таблицу в DataGrid достаточно использовать один метод:
-------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
||||||||||||||||||||
|
|||||||||||||||||||||
December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: нет Всего: 57 |
Хотелось бы добавить, что скоро выйдет ADO.NET 2, в которой будет кое-что новое, а в частности - асинхронное выполнение запросов (например, BeginExecuteNonQuery, EndExecuteNonQuery). Реализовано три спосооба получения данных от асинхронного запроса, что довольно удобно. Подробнее об этом имеет смысл прочитать у мелкомягких (ссылку не помню).
|
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Если по-английски сойдёт, то вот "Practical Guide to .NET DataTables, DataSets and DataGrids":
http://www.codeproject.com/csharp/Practica...eDataGrids1.asp http://www.codeproject.com/csharp/Practica...eDataGrids2.asp http://www.codeproject.com/csharp/Practica...eDataGrids3.asp Очень полная и неплохо построенная дока. -------------------- ![]() |
|||
|
||||
stron |
|
|||
![]() Консультант ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1654 Регистрация: 17.7.2003 Где: Питер Репутация: 4 Всего: 36 |
На форуме всё больше становится людей, интересующихся .NET-ом.
IMHO, пора создавать ФАК 2 Kurt отличный материал -------------------- подписи нет |
|||
|
||||
Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 2 Всего: 44 |
Как??? -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 6 Всего: 118 |
Да вообщем-то старыми дедовским способам - перегрузкой
![]() |
|||
|
||||
Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 2 Всего: 44 |
Кстати оказывается, что для подключения к базам можно использовать не только ADO.NET, но и ODBC и других провайдеров.
Что наиболее красива реализовано, так это то, что потом можно при помощи специальных классав типа OleDbDataAdapter, ODBCDataAdapter и т.д. Это все "приводить" к DataSet и работать обсолютно одинаково не взирая, так сказать на лица. Супер! Я была в вовсторге. Или я ошибаюсь? -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
ADO.NET - это и есть та самая надстройка над разнотипными источниками данных (таких как ODBC, OLE DB, XML), позволяющая работать с ними через DataSet. -------------------- ![]() |
|||
|
||||
Guest |
|
|||
Unregistered |
Здравствуйте Kurt.
Прошу прощенья за вопрос не по теме. Спасибо за ответ, эту статью я прочитал, но вопрос задал, случайно, не в ту тему. Код OleDbConnection conn = new OleDbConnection(); conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;"+@"data source=G:\baza.mdb"; conn.Open(); string sSQL = "select * from superTable"; //этот запрос будет использоваться при выборке данных с сервера OleDbDataAdapter myAdapter = new OleDbDataAdapter(sSQL, conn); //создаем и заполняем DataSet DataSet myDS = new DataSet("MyDataSet"); try{ myAdapter.Fill(myDS, "superTable"); } catch(Exception ex){ //обрабатываем ошибку Console.WriteLine("Error! "+ex.Message); } finally //так или иначе, но мы должны закрыть соединение { conn.Close(); } .. //закончив изменения с DataSet, отправим изменения на сервер: myAdapter.Update(myDS, "superTable"); и для подключения в гриде: dataGrid1.SetDataBinding(myDS,"superTable"); //показываем таблицу с именем superTable Я не увидел явной связи между MyAdapter и myDS. Если можно, подскажите пожалуйста, - где можно прочитать об этом поподробнее (если можно на русском языке). И если не сильно затруднит какой ни будь примерчик: с mdb - файлом, скажем две связанные таблички и гридами кликнув на какой то записи чтоб открывался диалог с другим гридом и связанными записями (из первой табличке). ![]() Заранее благодарен. Garry |
|||
|
||||
Kurt |
|
||||||
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: 20 Всего: 36 |
Ну, связь, вроде простая - DataAdapter позволяет автоматизировать работу с DataSet'ом. Вот смотрите:
Т.е. я заполняю DataSet всего одной строчкой. Виноват, двумя строчками, если считать SQL-запрос. Если делать без DataAdapter, то нужно вручную создавать таблицу в DataSet (DataTable someTable = new DataTable(..)..), исполнять запрос к базе, с помощью DataReader читать, создавать строки в DataTable.. А так - все просто. ![]()
Уточните, пожалуйста. Вы хотите все это сделать используя "локальную копию БД"? Т.е. манипулируя уже загруженными DataSet'ами? имхо, проще выполнить соотв. запрос в базу (select то-то и то-то from таблица1, таблица2 where..). Иногда проще выполнить коротенький запрос, чем занимать кучу оперативной памяти, забивая ее данными из таблицы.. Добавлено @ 21:29 P.S. Не хотите зарегистрироваться? Присоединяйтесь к нам на огонек - мы всегда рады новым людям. ![]() -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
||||||
|
|||||||
GarryKI |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 9.11.2004 Репутация: нет Всего: нет |
Всем добрый день!
Kurt - спасибо за отзыв я зарегистрировался сразу после вопроса (Guest в вопросе теперь GarryKI). Конечно с запросом (SQL) удобнее. С базами и grid-ом у меня все примеры компилировались с ошибками, поэтому я задал этот вопрос. Затем с очередным примером получилось вставить данные запроса в грид при помощи DataAdapter. Но пример: 1. мне нужен что б понять структуру программы, например VS не всегда подхватывает второй файл *.cs и не какие namespace - не помогают, потом в очередной раз закроешь студию, - откроешь и все заработает, - это глюк или я что то не так делаю? 2. VS затирает в блоке инициализации все изменения, если вставлять изменения за комментариями TODO - не всегда все гладко срабатывает (компиляция). 3. Я правильно понимаю - Что для инициализации необходимо использовать метод "frm_load". Или как правильнее? 4. не хотелось бы создавать много OleDbConnection - ов к одной и тойже базе если мне нужны разные таблици из разных форм (одной программы (процесса))? Если это возможно подскажите пожалуйста как, если можно с примером (mdb - достаточно, мне главное понять). Заранее спасибо мой e-mail: [email protected] или ICQ: 172893304 |
|||
|
||||
Tomcat |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 4.4.2003 Где: Гродно, Беларусь Репутация: 2 Всего: 2 |
Я, конечно, не Kurt, но...
1. Здесь не знаю... С такой бедой не сталкивался. Попробуй, может, просто сохранять проект перед компиляцией. 2. Уточни, пожалуйста. Где именно вставляешь, что выдает при ошибке. 3. Нет, такой необходимости нет. Хотя есть зависимость от того, что ты инициализируешь. Я обычно пользуюсь таким способом: все свои инициализации выделяю в отдельный метод формы, MyInit, какой-нибудь, и добавляю его вызов в конструктор. 4. Если работаешь с DataSet, то придется. DataAdapter используется обычно для связи одной таблицы DataSet и одной таблицы самой базы (хотя можно и такой запрос для DataAdapter написать, что связь будет иной, но это уже другие вопросы). Вот и получается, одна таблица - один адаптер. А по поводу примера, посмотри эти статьи... Помоему, здесь все не плохо расписано. http://www.aspnetmania.com/Articles/Category/4.html Только читай их от последней к первой. ![]() |
|||
|
||||
Srg |
|
||||
Unregistered |
Прошу прощения, но я не понял ответ на п.4
У себя я создаю один коннект к БД и раздаю его "всем, кто попросит". Например:
и таким образом в различных местах. |
||||
|
|||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |