Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Bibd_Vopros-Otvet_k_ekzamenu.docx
Скачиваний:
27
Добавлен:
11.05.2015
Размер:
588.58 Кб
Скачать

Технология "клиент-сервер"

Технология "клиент-сервер" описывает взаимодействие между двумя компьютерами, согласно которому клиент запрашивает у сервера некоторые услуги, а сервер обслуживает запрос. Технология клиент-сервер удобна для описания взаимодействия программ, находящихся в различных узлах сети. В Internet компьютеры, используемые для обращения к глобальной сети, выполняют функции клиентов, а компьютеры, на которых хранится информация, действуют как серверы. Аппаратные и программные средства, включая DNS, брандмауэры, маршрутизаторы и шлюзы признаны обеспечить, чтобы запрос клиента и информация, возвращаемая сервером, попали по месту назначения.Web-броузер – это клиентская программа, которая формирует запросы на получение услуг от некоторого сервера, находящегося в Internet; в качестве примера можно привести запрос на передачу Web-страницы. Технология клиент-сервер широко используется, например, в банковской системе. Для того чтобы проверить счет пользователя в банке, его компьютер направляет запрос серверной программе, выполняющейся на банковской машине. Требуемая информация возвращается клиентской программе, которая отображает данные, предназначенные для пользователя.Понимая работу программ, соответствующих архитектуре клиент-сервер, вы сможете более успешно разрешать проблемы, связанные с передачей и отображением Web-страниц.

  1. Архитектура 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

  • Сторонние библиотеки

  1. Работа на основе 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 – используется при поиске, сортировке, для выполнения различных действий над записями таблиц.

  1. Работа на основе 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();

  1. Работа на основе 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.

  1. Строка соединения и её параметры

Имеется 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)

  1. Командная строка. Запросы с параметрами

Пример запроса с параметрами:

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.

  1. Вызов хранимых процедур

Пример работы с ХранимойПроцедурой:

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

  1. Работа с курсорами

Работа с курсором на языке 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-я строка).

  1. Наборы данных DataSet

Для создания типизированного набора DataSetнадо добавить самDataSetкак новое решение. Далее необходимо активировать соединение с сервером, чтобы подключиться к конкретной БД. (Добавляем соединение через окноServerExplorer).Работа с Server Explorer

  1. Запустите Visual Studio .NET.

  2. Используйте Visual Basic .NET или Visual C# .NET для создания нового проекта приложения Windows Application.

  3. В меню View запустите команду Server Explorer. В окне Server Explorer window отображаются ресурсы сервера в виде дерева с следующими узлами:

  • Data Connections

  • Servers

  • Разверните узел Data Connections.  В данном списке содержатся все доступные подключения к базам данных. Вы можете создать подключение к Microsoft SQL Server, работающему на сервере Microsoft Windows, или создать подключение к базе данных Oracle, расположенной на сервере под управлением UNIX. Подключения к базам данных могут не отображаться в Server Explorer в зависимости от используемой Вами конфигурации компьютера.

  • Разверните узел Servers.  В данном списке содержатся все доступные серверы. Для каждого сервера отображаются все доступные ресурсы и базы данных, которые вы можете использовать в своем проекте.

    Добавление подключения к источнику данных

    1. В окне Server Explorer разверните элемент Data Connections и нажмите кнопку Add Connection.

    2. В окне Data Link Properties введите или выберете из списка имя сервера. Например, если Microsoft SQL Server установлен на локальной машине, введите следующее имя сервера local.

    3. Введите информацию о подключении, если это необходимо в вашей конфигурации.

    4. Выберите базу данных. Например, при подключении к SQL Server Вы можете указать Northwind.

    5. Нажмите кнопку Test Connection для проверки корректности параметров подключения. Через несколько секунд должно отобразиться следующее информационное сообщение:

    Test connection succeeded

    Если в процессе проверки соединения будут обнаружены ошибки, проверьте корректность параметров подключения.

    1. Нажмите кнопку ОК. Обратите внимание, что новое подключение отображается в окне Server Explorer как дочерний элемент в группе Data Connections.

    2. Разверните созданное подключение к базе данных.  Обратите внимание, что в окне Server Explorer отображаются доступные таблицы, представления и хранимые процедуры.

    Добавление сервера

    1. В окне Server Explorer разверните элемент Servers и нажмите кнопку Add Server .

    2. В диалоговом окне Add Server введите имя сервера, отличное от имени вашего компьютера, или IP-адрес сервера, отличный от используемого Вами.

    3. Если Вы используете различные учетные записи при подключении к серверам, нажмите кнопку Connect using a different user name и введите имя пользователя и пароль.

    4. Нажмите кнопку ОК.  Убедитесь, что новый сервер отображается в окне Server Explorer как дочерний элемент в группе Servers.

    5. Разверните созданное Вами подключение к серверу. В окне Server Explorer будут отображены доступные для Вас ресурсы сервера, такие как службы Crystal Reports, журналы событий, очереди сообщений, системные счетчики, службы и серверы SQL Server. Данную информацию моно получить и о локальном компьютере.

    Перетащите соединение из окна Server Explorer на Вашу форму

    Вы можете использовать метод drag-and-drop (перетаскивание мышью) для копирования объектов из окна Server Explorer в окно конструктора Visual Studio .NET. Интегрированная среда разработки (IDE) автоматически создает предварительно созданные объекты для использования в Вашем приложении.  Данная возможность позволяет значительно ускорить процесс разработки приложений. Например, при перемещении подключения к базе данных на форму Visual Studio .NET автоматически создает объект подключения без необходимости ручного редактирования исходного кода. Для использования метода drag-and-drop для создания нового подключения к базе данных выполните следующие действия:

    1. В окне Server Explorer выберите подключение, которое необходимо использовать, и переключитесь в режим Form Designer.

    2. Перетащите подключение из окна 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);

    1. Типизированные наборы данных. Триггеры

    Триггер – это ХП, которая реагирует на удаление, изменение и добавление записей.

    Пример:

    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);

    1. Использование отношений для перемещения по таблицам

    Пример:

    При считывании таблиц в 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;

  • Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]