- •Вопросы к экзамену по БиБд:
- •Ответы к вопросам:
- •Технология "клиент-сервер"
- •Параметры
- •Возвращаемое значение
- •Реализации
- •Регулярные выражения
- •Синтаксис
- •Спецсимволы
- •Расширенные спецсимволы
- •Операторы
- •Расширенные операторы
- •Er-модель данных
- •История создания[править]
- •Нотации[править]
- •Нотация Питера Чена[править]
- •Crow's Foot[править]
- •6.2.2. Основные понятия модели Entity-Relationship (Сущность-Связи)
- •6.2.3. Нормальные формы er-схем
- •11.5. Проектирование базы данных с помощью метода er-моделирования
- •11.5. Проектирование базы данных с помощью метода er-моделирования
- •4.4 Хранимые процедуры
Технология "клиент-сервер"
Технология "клиент-сервер" описывает взаимодействие между двумя компьютерами, согласно которому клиент запрашивает у сервера некоторые услуги, а сервер обслуживает запрос. Технология клиент-сервер удобна для описания взаимодействия программ, находящихся в различных узлах сети. В Internet компьютеры, используемые для обращения к глобальной сети, выполняют функции клиентов, а компьютеры, на которых хранится информация, действуют как серверы. Аппаратные и программные средства, включая DNS, брандмауэры, маршрутизаторы и шлюзы признаны обеспечить, чтобы запрос клиента и информация, возвращаемая сервером, попали по месту назначения.Web-броузер – это клиентская программа, которая формирует запросы на получение услуг от некоторого сервера, находящегося в Internet; в качестве примера можно привести запрос на передачу Web-страницы. Технология клиент-сервер широко используется, например, в банковской системе. Для того чтобы проверить счет пользователя в банке, его компьютер направляет запрос серверной программе, выполняющейся на банковской машине. Требуемая информация возвращается клиентской программе, которая отображает данные, предназначенные для пользователя.Понимая работу программ, соответствующих архитектуре клиент-сервер, вы сможете более успешно разрешать проблемы, связанные с передачей и отображением Web-страниц.
Архитектура ADO.Net
ADO.Net – платформа, представляющая набор базовых классов для работы с различными БД. Имеются следующие провайдеры:
ODBC (BDE)
OLEDB ( Обеспечивает связь с БД, не взаимодействует с MS SQL Server)
SQL Server Compact Edition (Облегчённый вариант сервера ориентированный на создание web приложений)
ADO.Net пришла на смену технологии BDE, представляет собой набор объектных классов, таких как: Connection, DataSet, DataTable, DataAdapter, DataRows и так далее. Эти классы функционируют с Framework 4.0 (3.5, 3.0 …). Технология .Net впервые была представлена в 2002 году. Microsoft в Visual Studio интегрировала в среду ADO.Net . Также следует отметить развитие web технологий, в том числе и для работы с БД (ASP.Net, ASP.Net MVC).
ADO.NET используется многоуровневая архитектура, которая обращается вокруг небольшого числа ключевых концепций, таких как объекты Connection, Command и DataSet. Однако архитектура ADO.NET серьезно отличается от классической архитекуры ADO.
ADO.NET — часть фреймфорка .NET, предоставляющая доступ к данным для приложений основанных на Microsoft .NET. Является не развитием более ранней технологии ADO, а самостоятельной технологией.
Классы ADO.NET находятся в сборке System.Data.dll.
Многие другие части фреймворка .NET, как и сторонние библиотеки, используют те или иные части ADO.NET. Например:
Части .Net Framework
Entity Framework
Linq to SQL
Сторонние библиотеки
Работа на основе OleDbConnection
Пакет OleDB предназначен для работы в БД в Microsoft ( FoxPro, Excel, Access). Важнейший момент связывания с исполняемым соединением – задание строки соединения.
Пример: OleDbConnection MyCon = new OleDbConnection( “Provider = Microsoft.Jet.OleDB.4.0;” + “DataSource = c:\work\my.mdf”);
При открытии соединения информация о нем помещается в pool, так что при закрытии соединения информация сохраняется в пуле для экономии времени. Если соединение открыли успешно, то необходимо подготовить команду для работы с таблицей (select, update) или подготовить команду для вызова хранимой процедуры (ExecuteQuery – Select, Execute N Query). Пример:
OleDB Command Mycmd = myCon.CreateCommand;
Mycmd.Connection = myCon;
String cmdTexts = “Select * from Sclad”;
Mycmd.CommandText = cmd.text;
Имеются варианты так называемых параметризированных запросов, которые используют параметры конкретизирующие SQL команду, например: …”Select Tovar from sclad where price <= 500”.
Классы параметров:
DataAdapter – предназначен для физического считывания записей из источника данных в DataSet, для этого используется метод fill. На ряду с адаптером имеется облегчённый DataReader, он работает быстрее, но не предназначен для изменения данных.
DataSet – позволяет хранить одну и более таблиц одновременно считываемых из источника. Каждая таблица DataTable содержит записи представления в свойстве Rows. Также позволяет читать и конвертировать формат XML, обеспечивает отношения между таблицами.
DataView – используется при поиске, сортировке, для выполнения различных действий над записями таблиц.
Работа на основе ODBC Connection
Пример:
using System;
using System.Text;
using System.Data;
using System.Data.Odbc;
namespace ConsoleApplication6
{
class Program
{
static void Main()
{
string scon = "DSN = myAcc";
OdbcConnection mycon = new OdbcConnection(scon);
string sq = "Select * from stud";
OdbcCommand cmd = new OdbcCommand(sq);
OdbcDataAdapter da = new OdbcDataAdapter();
da.SelectCommand = cmd;Возвращае* данные из ис*очника данных (свойс*во)
DataSet ds = new DataSet(); dataset – массив, когда добавляю*ся все данные
mycon.Open();
da.Fill(ds, "stud"); (Ме*од select comma*d)
ds.Tables[0].RowChanged += new DataRowChangeEventHandler(RowIsChanged);изменение с*роки
ds.Tables[0].Rows[0]["Fam"] = "Doe";
mycon.Close();
}
public static void RowIsChanged(Object sender, DataRowChangeEventArgs e)
{
Console.WriteLine("New row value is: " + e.Row["Fam"]);
Console.ReadLine();
}
}
}
Запрос, отличный от Select:
string sq = "Insert into stud values ('Sidorov',20)";
OdbcCommand cmd = new OdbcCommand(sq, mycon);
mycon.Open();
cmd.ExecuteNonQuery();
Работа на основе SQL Connection
Пример:
using System;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication6
{
class Program
{
static void Main()
{
string scon = @"server = local;" + "database = stud; uid = boss;" + "password=1234; integratedsecurity = SSPI";
string sq = "select * from tovar";
SqlConnection mycon = new SqlConnection(scon);
SqlCommand cmd = mycon.CreateCommand();
cmd.CommandText = sq;
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
mycon.Open();
da.Fill(ds, "stud");
ds.Tables[0].RowChanged += new DataRowChangeEventHandler(RowIsChanged);
ds.Tables[0].Rows[0]["Fam"] = "Doe";
mycon.Close();
}
public static void RowIsChanged(Object sender, DataRowChangeEventArgs e)
{
Console.WriteLine("New row value is: " + e.Row["Fam"]);
Console.ReadLine();
}
}
}
Значение SSPI использует для логина (вхождения в сервер) учётную запись Windows.
Строка соединения и её параметры
Имеется 3 типа соединений:
OdbcConnection (соединение с машиной фирмы Borland)
Пример: Odbc Connection Con = new Connection();
Con.ConnectionString = “DSN = mycon”;
OleDBConnection (соединение с БД Microsoft)
Пример: OleDbConnection MyCon = new OleDbConnection( “Provider = Microsoft.Jet.OleDB.4.0;” + “DataSource = c:\work\my.mdf”);
SQLConnection (соединение с MS SQL Server)
Пример: SqlConnection Scon = new Sqlconnection();
Scon.ConnectionString = “DataSource = ./SQLExpress;” + “UserInstance = true;” + “User Id = stud; Password = 1234”;
Еще пример: SqlConnection MyCon = new SqlConnection(“Server = localhost;” + “DataSource =mydb.mdf;” + IntegratedSecurity = true”);
MyCon.Open();
(примечание: ./ определяет локальный компьютер, т.е. localhost)
Командная строка. Запросы с параметрами
Пример запроса с параметрами:
using System;
using System.Text;
using System.Data;
using System.Data.OleDb;
namespace ConsoleApplication6
{
class Program
{
static void Main()
{
string scon = @"provider = Microsoft.Jet.OleDB.4.0; DataSource = C:\\1\\mydb.mdb"; (соединение с БД)
string sq = "Select * from stud where Fam = Petrov";
OleDbConnection con = new OleDbConnection(scon);
OleDbCommand cmd = con.CreateCommand();
cmd.CommandText = sq;
cmd.Parameters.Add("Par1", DbType.String).Direction = ParameterDirection.Input;
cmd.Parameters[0].Value = "NichihuaSebe!";
OleDbDataAdapter oda = new OleDbDataAdapter();
oda.SelectCommand = cmd;
DataSet ds = new DataSet();
con.Open();
oda.Fill(null);
ds.Tables[0].RowChanged += new DataRowChangeEventHandler(RowIsChanged);
ds.Tables[0].Rows[0]["Fam"] = "Doe";
con.Close();
}
public static void RowIsChanged(Object sender, DataRowChangeEventArgs e)
{
Console.WriteLine("New row value is: " + e.Row["Fam"]);
Console.ReadLine();
}
}
}
Типы параметров: char, DateTime, decimal, Image, int, varchar,variant. Если параметр объявлен как выходной(output), что имеет место при вызове ХП, то значение параметра можно получить через конструкцию: cmd.Parameters[0].Value.
Вызов хранимых процедур
Пример работы с ХранимойПроцедурой:
MySql delimiter //
MySql create procedure find cena (IN for varchar(25), oul CEN INT)
->begin
->select price into cen from sclad where Tovar = fov;
->end
->//
Вернуть обратно: MySql > delimeter;
MySql > call fing cena (‘milk’, @x);
MySql >select @x;
Текст процедуры нельзя ввести с помощью LOAD. Просмотр текста процедуры можно с помощью команды:
MySql >show create procedure find cena;
MySql >select body from mysql proc
->where name = “find cena”;
Вызов ХП:
На удаление:
Procedure proc1( IN par1 INT)
Begin
Delete from Sklad where IO = par1
End
На изменение:
Procedure proc2( IN par1 INT) N par2 varchar(50))
Begin
Update Sclad
Set Tovar = par2
Where ID = par1
End
Вставка:
Procedure proc3(IN par1 INT IN par2 varchar(50))
Begin
Insert into sclad value (par1,par2)
End
Работа с курсорами
Работа с курсором на языке MySql:
MySql >delimiter //
->create procedure proc1(out tov varchar(25))
->begin
->DECLARE cur CURSOR for select Tovar from sclad
->where price = (select min(price) from sclad)
->open cur
->fetch cur into tov
->close cur
->end
->//
MySql >delicimer
Работа с курсором на языке T-SQL:
CREATE PROCEDURE MyProc AS
DECLARE Mycur CURSOR FOR
SELECT tovar,price FROM Sclad WHERE price > 2000
FOR READ ONLY
OPEN Mycur
DECLARE @tovar VARCHAR(40)
DECLARE @price INT
FETCH NEXT FROM Mycur INTO @tovar, @price
PRINT @tovar + str(@price)
CLOSE Mycur
DEALLOCATE Mycur
Fetch – переход к следующей записи. Deallocate – удаляет курсор.
На ряду с NEXT используется: PRIOR (переход назад), FIRST, LAST, ABSOLUTE 4/-4 (переход к 4й записи сначала/к 4й записи с конца), RELATIVE 2 (перейти вперёд на 2 записи от текущей).
Пример:
CREATE PROCEDURE myproc AS
DECLARE @n INT
DECLARE mycur CURSOR SCROLL FOR
SELECT Tovar, price FROM sclad FOR
READ ONLY
OPEN mycur
DECLARE @tovar VARCHAR(40)
DECLARE @price INT
SET @n = 0
WHILE(@n < @@CURSOR_ROWS)
BEGIN
SET @n = @n+1
FETCH ABSOLUTE @n FROM mycur
INTO @tovar, @price
END
PRINT Tovar + str(price)
CLOSE mycur
DEALLOCATE mycur
Курсор в SQL – это область в памяти базы данных, которая предназначена для хранения последнего оператора SQL. Если текущий оператор – запрос к базе данных, в памяти сохраняется и строка данных запроса, называемая текущим значением, или текущей строкой курсора. Указанная область в памяти поименована и доступна для прикладных программ.
Обычно курсоры используются для выбора из базы данных некоторого подмножества хранимой в ней информации. В каждый момент времени прикладной программой может быть проверена одна строка курсора. Курсоры часто применяются в операторах SQL, встроенных в написанные на языках процедурного типа прикладные программы. Некоторые из них неявно создаются сервером базы данных, в то время как другие определяются программистами.
Управление курсором в среде MS SQL Server
Управление курсором реализуется путем выполнения следующих команд:
DECLARE – создание или объявление курсора;
OPEN – открытие курсора, т.е. наполнение его данными;
FETCH – выборка из курсора и изменение строк данных с помощью курсора;
CLOSE – закрытие курсора;
DEALLOCATE – освобождение курсора, т.е. удаление курсора как объекта.
Объявление курсора
В стандарте SQL для создания курсора предусмотрена следующая команда:
<создание_курсора>::=
DECLARE имя_курсора
[INSENSITIVE][SCROLL] CURSOR
FOR SELECT_оператор
[FOR { READ_ONLY | UPDATE
[OF имя_столбца[,...n]]}]
Курсоры прекрасно поддерживаются в хранимых процедурах, функциях и триггерах. Синтаксис такой же, как и во внедренном SQL. Курсоры пока только для чтения, однонаправленные (т.е по набору можно ходить только вперед без возможности вернуться) и невосприимчивы. Невосприимчивость означает, что сервер может создавать копию результатирующей таблицы, а может и не создавать, формируя ее на лету .
Курсоры должны быть объявлены до их использования. Переменные с условиями объявляются прежде курсоров. Обработчики объявляются строго после объявления курсоров.
Например:
CREATE PROCEDURE curdemo() BEGIN DECLARE done INT DEFAULT 0; DECLARE a CHAR(16); DECLARE b,c INT; DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1; DECLARE cur2 CURSOR FOR SELECT i FROM test.t2; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN cur1; OPEN cur2; REPEAT FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF NOT done THEN IF b < c THEN INSERT INTO test.t3 VALUES (a,b); ELSE INSERT INTO test.t3 VALUES (a,c); END IF; END IF; UNTIL done END REPEAT; CLOSE cur1; CLOSE cur2; END
Объявление курсоров
DECLARE cursor_name CURSOR FOR select_statement
Это выражение объявляет курсор c именем cursor_name. select_statement указывает на конструкцию типаSELECT ... FROM ... Можно объявить много курсоров в подпрограмме, но каждый курсор в данном блоке должен иметь уникальное имя. Выражение SELECT не должно содержать указание INTO.
Открывание курсоров
OPEN cursor_name
Выражение открывает ранее объявленный курсор
Выборка из курсора в переменную
FETCH cursor_name INTO var_name [, var_name] ...
Это выражение выбирает следующую строку (если строка существует), используя указанный открытый курсор, и продвигает указатель курсора. Если более строк не доступно, происходит изменение значения переменной SQLSTATE в 02000. Для отлова этого события вы должны установить обработчик: HANDLER FOR SQLSTATE '02000'
Закрытие курсора
CLOSE cursor_name
Закрывает курсор cursor_name. Если явно не указано, то курсор закрывается автоматически при закрытии соответствующего блока подпрограммы.
Как использовать курсоры
Применение курсора в процедурах осуществляется путем последовательного выполнения следующих шагов:
При помощи оператора DECLARE объявляется курсор для отдельного оператора SELECT или для отдельной процедуры.
Оператором OPEN производится открытие курсора.
Используя оператор FETCH, осуществляется установление указателя на требуемую запись курсора. При этом значения полей текущей записи присваиваются переменным, указываемым в оператореFETCH. Обычно это конструкция помещается в итеративный элемент (проще говоря цикл), который прерывается по некоторому условию. См. пример выше.
В процессе перемещения указателя текущей записи курсора при выходе указателя за пределы курсора устанавливается значение SQLSTATE = 02000.
После того как курсор становится ненужным, он закрывается оператором CLOSE.
Примеры курсоров
Приведу еще один пример курсора. Курсор предназначен для выборки данных (идентификаторов записей) в строку с разделителем ввиде запятой по переданным параметрам. Курсор находится внутрихранимой функции get_pedplan(). В нее передается три параметра: lip-номер лаборатории, ti-номер пары и dt - дата проведения занятия.
01: CREATE DEFINER = 'for_spammers'@'zoonman.ru' FUNCTION `get_pedplan`(lip INTEGER(11), ti INTEGER(11), dt DATE) 02: RETURNS char(64) CHARSET latin1 03: DETERMINISTIC 04: CONTAINS SQL 05: SQL SECURITY INVOKER 06: COMMENT 'Функция возвращает список id из таблицы raspisanie' 07: BEGIN 08: 09: DECLARE done INT DEFAULT 0; 10: DECLARE a INT; 11: DECLARE retv CHAR(64); 12: DECLARE flg INT; 13: 14: DECLARE cur1 CURSOR FOR SELECT id FROM raspisanie WHERE timeintv=ti AND rdate=dt AND labip=lip ; 15: DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 16: OPEN cur1; 17: SET retv:=''; 18: SET flg:=0; 19: REPEAT 21: FETCH cur1 INTO a; 22: IF NOT done THEN 23: IF flg!=0 THEN 24: SET retv:= CONCAT(retv,',' , a); 25: ELSE 26: SET retv:=a; 27: SET flg:=1; 28: END IF; 29: END IF; 30: UNTIL done END REPEAT; 31: CLOSE cur1; 32: RETURN retv; 33: END;
Курсор определен на строке 14. Открыт на 16 строчке. С 19-й начат проход по выборке полученной курсором. На каждом шаге цикла происходит считывание записи (21-я). Затем, если не достигнут конец выборки (22-я), выполняется проверка флага на первую запись (23-я). Если запись первая, то присваиваем retv текущее значение выборки (26-я) и устанавливаем флаг (27-я), иначе объединяем значение retv с текущим значением выборки (строка 24). После прохода по курсору закрываем его (31-я) и возвращаем значение (32-я строка).
Наборы данных DataSet
Для создания типизированного набора DataSetнадо добавить самDataSetкак новое решение. Далее необходимо активировать соединение с сервером, чтобы подключиться к конкретной БД. (Добавляем соединение через окноServerExplorer).Работа с Server Explorer
Запустите Visual Studio .NET.
Используйте Visual Basic .NET или Visual C# .NET для создания нового проекта приложения Windows Application.
В меню View запустите команду Server Explorer. В окне Server Explorer window отображаются ресурсы сервера в виде дерева с следующими узлами:
Data Connections
Servers
Разверните узел Data Connections. В данном списке содержатся все доступные подключения к базам данных. Вы можете создать подключение к Microsoft SQL Server, работающему на сервере Microsoft Windows, или создать подключение к базе данных Oracle, расположенной на сервере под управлением UNIX. Подключения к базам данных могут не отображаться в Server Explorer в зависимости от используемой Вами конфигурации компьютера.
Разверните узел Servers. В данном списке содержатся все доступные серверы. Для каждого сервера отображаются все доступные ресурсы и базы данных, которые вы можете использовать в своем проекте.
Добавление подключения к источнику данных
В окне Server Explorer разверните элемент Data Connections и нажмите кнопку Add Connection.
В окне Data Link Properties введите или выберете из списка имя сервера. Например, если Microsoft SQL Server установлен на локальной машине, введите следующее имя сервера local.
Введите информацию о подключении, если это необходимо в вашей конфигурации.
Выберите базу данных. Например, при подключении к SQL Server Вы можете указать Northwind.
Нажмите кнопку Test Connection для проверки корректности параметров подключения. Через несколько секунд должно отобразиться следующее информационное сообщение:
Test connection succeeded
Если в процессе проверки соединения будут обнаружены ошибки, проверьте корректность параметров подключения.
Нажмите кнопку ОК. Обратите внимание, что новое подключение отображается в окне Server Explorer как дочерний элемент в группе Data Connections.
Разверните созданное подключение к базе данных. Обратите внимание, что в окне Server Explorer отображаются доступные таблицы, представления и хранимые процедуры.
Добавление сервера
В окне Server Explorer разверните элемент Servers и нажмите кнопку Add Server .
В диалоговом окне Add Server введите имя сервера, отличное от имени вашего компьютера, или IP-адрес сервера, отличный от используемого Вами.
Если Вы используете различные учетные записи при подключении к серверам, нажмите кнопку Connect using a different user name и введите имя пользователя и пароль.
Нажмите кнопку ОК. Убедитесь, что новый сервер отображается в окне Server Explorer как дочерний элемент в группе Servers.
Разверните созданное Вами подключение к серверу. В окне Server Explorer будут отображены доступные для Вас ресурсы сервера, такие как службы Crystal Reports, журналы событий, очереди сообщений, системные счетчики, службы и серверы SQL Server. Данную информацию моно получить и о локальном компьютере.
Перетащите соединение из окна Server Explorer на Вашу форму
Вы можете использовать метод drag-and-drop (перетаскивание мышью) для копирования объектов из окна Server Explorer в окно конструктора Visual Studio .NET. Интегрированная среда разработки (IDE) автоматически создает предварительно созданные объекты для использования в Вашем приложении. Данная возможность позволяет значительно ускорить процесс разработки приложений. Например, при перемещении подключения к базе данных на форму Visual Studio .NET автоматически создает объект подключения без необходимости ручного редактирования исходного кода. Для использования метода drag-and-drop для создания нового подключения к базе данных выполните следующие действия:
В окне Server Explorer выберите подключение, которое необходимо использовать, и переключитесь в режим Form Designer.
Перетащите подключение из окна Server Explorer на форму Form1. Среда разработки Visual Studio .NET автоматически создаст объект SQLConnection с установленными параметрами соединения ConnectionString, включая свойства Database и DataSource.
Вы можете использовать созданный объект SQLConnection далее в Вашем программном коде.
Проверка работоспособности соединения
После добавления подключения в группе Data Connections появится новый элемент. Дополнительно, появится возможность просмотра таблиц, представлений и хранимых процедур, расположенных на сервере. Поле добавления сервера в группе Servers появится новый элемент. Вы можете использовать данный элемент для просмотра ресурсов сервера, таких как службы Crystal Reports, журналы событий, очереди сообщений, системные счетчики, службы и серверы SQL Server. После добавления подключения на форму Form1 объект SQLConnection с именем SQLConnection1(в Visual Basic .NET) илиsqlConnection1(в Visual C# .NET) появляется в списке Component .Далее нужно мышью перенести имена таблиц в окно DataSet, которое занимает весь экран. Кроме таблиц можно добавить и связи. Пример работы DataSet:
private void button3_Click(object sender, EventArgs e)
{
string scon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=K:\\123.accdb";
SqlConnection mycon = new SqlConnection(scon);
string q = "select * from stud";
SqlCommand cmd = mycon.CreateCommand();
cmd.Connection = SqlConnection(mycon); //?
cmd.CommandText = q;
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet1 ds = new DataSet1();
mycon.Open();
da.Fill(ds, "stud");
DataTable mytab = ds.Tables["stud"];
mycon.Close();
}
Можно реализовать добавление, удаление, поиск строк.
Поиск выполняется через фильтр:
Пример:
DataTable tbl = ds.Tables[0];
tbl.DefaultView.RowFilter = "Name = 'Petrov' ";
Пример:
DataTable tbl1 = ds.Tables[0];
DataRow[] drs = tbl1.Select("age > 18");
foreach (DataRow dr in drs)
{ ... }
Добавление (редактирование) строки:
Пример:
DataTable tbl = ds.Tables[0];
DataRow dr = tbl.NewRow();
dr["fam"] = "Mays";
dr["age"] = 20;
tbl.Rows.Add(dr);
Удаление:
Пример:
Удалить 10 строк
DataTable tbl = ds.Tables[0];
tbl.Rows.RemoveAt(10);
Пример:
Удалить строку dr
tbl.Rows.Remove(dr);
Типизированные наборы данных. Триггеры
Триггер – это ХП, которая реагирует на удаление, изменение и добавление записей.
Пример:
using System;
using System.Text;
using System.Data;
using System.Data.OleDb;
namespace ConsoleApplication6
{
class Program
{
static void Main()
{
OleDbConnection mycon = new OleDbConnection( "Provider = Microsoft.Jet.OleDB.4.0;" + "DataSource = C:\\1\\mydb.mdb");
OleDbCommand mycmd = mycon.CreateCommand();
mycmd.Connection = mycon;
mycon.Open();
string sq = "Select * from stud";
mycmd.CommandText = sq;
DataSet ds = new DataSet();
OleDbDataAdapter oda = new OleDbDataAdapter(mycmd);
oda.Fill(null);
ds.Tables[0].RowChanged += new DataRowChangeEventHandler( RowIsChanged );
ds.Tables[0].Rows[0]["Fam"] = "Doe";
mycon.Close();
}
public static void RowIsChanged(Object sender, DataRowChangeEventArgs e)
{
Console.WriteLine("New row value is: " + e.Row["Fam"]);
Console.ReadLine();
}
}
}
Аналогично изменение:
ds.Tables[0].RowChanging += new DataRowChangeEventHandler(MyProcForCh);
Удаление после завершения:
ds.Tables[0].RowDeleted += new DataRowChangeEventHandler(ProcForDEl);
Использование отношений для перемещения по таблицам
Пример:
При считывании таблиц в DataSet связи между таблицами теряются. Допустим, в Access есть 2 таблицы:
Stud (содержит поля name, grp)
Range (содержит поля name, range)
Таблицы связаны по полю name. Создадим приложение на основе формы:
Кнопка Load:
private void button1_Click(object sender, EventArgs e)
{
string constr = @"provider = Microsoft.Jet.OleDb.4.0;" + @"data source = C:\Users\Violent\Documents\123.mdf";
System.Data.OleDb.OleDbConnection myCon = new System.Data.OleDb.OleDbConnection(constr);
string sq = "Select Name, grp from Stud";
System.Data.OleDb.OleDbCommand cmd = myCon.CreateCommand();
cmd.CommandText = sq;
System.Data.OleDb.OleDbDataAdapter oda1, oda2;
DataSet myDataSet;
myCon.Open();
oda1.Fill(myDataSet , "stud A" );
sq = "Select Name, Range from Range";
cmd.CommandText = sq;
oda2.Fill(myDataSet, "Range");
DataSet myDataTable1, myDataTable2;
myDataSet.Relations.Add("ret", myDataSet.Tables["stud A"].Columns["Name"],
myDataSet.Tables["Range A"].Columns["Name"]);
Name :textBox1.DataBindings.Add("Text", myDataTable1, "Name");
grp :textBox2.DataBindings.Add("Text", myDataTable1, (string)"grp");
Range:textBox3.DataBindings.Add("Text", myDataTable2, (string) "range");
}
Кнопка Show:
private void button2_Click(object sender, EventArgs e)
{
DataRow myDataTable1 = null;
DataRow[] rows = myDataTable1.Table.Select("Name' " + textBox1.Text + "'");
if (rows.Length > 0 )
{
textBox2.Text = rows[0]["grp"].ToString();
var childrows = rows[0].GetChildRows("rd");
textBox3.Text = childrows[0]["Range"].ToString();
}
}
Пример:
*вот этот код точно должен работать: *
string con = @"Provider=Microsoft.Jet.OLEDB.4.0.; data source=D:\1.mdb";
OleDbConnection myconn = new OleDbConnection(con);
string s = "Select name,groop,rate from stud INNER JOIN rate on stud.id=rate.id";
OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = s;
OleDbDataAdapter ad = new OleDbDataAdapter(s, myconn.ConnectionString);
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
ad.Fill(table);
dataGridView1.DataSource = table;