Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

using System.Collections.Generic;



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

// эти строки должны быть добавлены для работы с классами ADO.NET

using System.Data;

using System.Data.SqlClient;

 

 

namespace ADONET

{

/* TODO 1: общие сведения о лабораторной работе

*

* Основной задачей лабораторной работы является изучение технологии ADO.NET -

* Active Data Objects.NET.

* Это базовая технология доступа к данным в платформе.NET.

* В данной лабораторной изучается работа с безовыми классами технолгии.NET,

* поэтому визуальных настроек и автоматической кодогенерации почти не будет

* Почти весь код будет написан вручную

*

* Лабораторная состоит из ряда заданий.

* После выполненния каждого задания программа должна компилироваться и запускаться.

* При этом на форме должны появляться полученные вами данные

*

* ВАЖНО:

* Если в зании указно, что результат выполнения должен быть записан

* в определённую переменную, именно туде его и надо записывать.

* Иначе будет непонятно, выполнено ли задание

*

* В лабораторной используется БД STUD (создаётся при выполнении сценария Students.sql)

* СУБД - MS SQL Server 2008 Express Edition

* Нам придётся работать не только с программным кодом, но и с самой базой данных

* Для этого нам понадобиться программа SQL Server Management Studio (ищите её

* в меню Программы Windows)

*

* Дополнительные сведения можно получить из "фирменного" справочника MSDN

* Вам будут полезны следующие разделы:

* - по SQL Server:

* http://msdn.microsoft.com/ru-ru/library/ms130214(v=sql.100).aspx

* - по технологии ADO.NET:

* http://msdn.microsoft.com/ru-ru/library/e80y5yhx(v=VS.90).aspx

* - по языку запросов LINQ:

* http://msdn.microsoft.com/ru-ru/library/bb386976(v=VS.90).aspx

*/

class DataAccess

{

private static DataAccess _instance;

private DataAccess()

{

 

_instance = this;

}//DataAccess()

 

public static DataAccess GetInstance()

{

if (_instance!= null)

return _instance;

else

return new DataAccess();

}//GetInstance

 

~DataAccess()

{

if (connection.State == ConnectionState.Open)

connection.Close();

}//~DataAccess()

 

/* TODO 2.1. Соединение с базой данных.

* Рассматривается установление соединения с БД

* и получение данных из физической таблицы

* при помощи классов SqlConnection, SqlCommand, SqlDataAdapter, DataTable

* */

 

// Класс SqlConnection управляет соединением с БД

private SqlConnection connection;

public SqlConnection Connection

{ get { return connection; } }

 

// Класс DataTable представляет таблицу с даннми в оперативной памяти

public DataTable ExampleTable = new DataTable();

// Класс SqlDataAdapter обеспечивает связь с физической таблицей,

// хранящейся в БД

public SqlDataAdapter AdapterExample;

 

public void ConnectToDatabase()

{

/* Строка соединения содержит параметры соединения с БД.



* В данном примере она содержит также и пароль пользователя,

* что в реальном приложении недопустимо. */

string connString =

"Data Source=.\\sqlexpress;Initial Catalog=STUD;Persist Security Info=True;User ID=sa;Password=123";

 

// Создаём объект для соединения с БД

connection = new SqlConnection();

// Передаём этому объекту строку соединения

connection.ConnectionString = connString;

 

// Создаём объект класса SqlCommand, обеспечивающий выполнение SQL-запроса

SqlCommand selectQuery = new SqlCommand();

// Настраиваем его на работу с нашим соединением

selectQuery.Connection = connection;

selectQuery.CommandType = CommandType.Text;

// Пишем сам SQL-запрос

selectQuery.CommandText = "SELECT * FROM Students_One";

 

// Создаём объект-адаптер для связи с физической таблицей

AdapterExample = new SqlDataAdapter(selectQuery);

// Указваем, что для получения данных будет использоваться

// только что созданный SQL-запрос

AdapterExample.SelectCommand = selectQuery;

 

try

{

// Открываем соединение

connection.Open();

// При помощи адаптера получаем данные и заполняем таблицу

AdapterExample.Fill(ExampleTable);

}

finally

{

// Соединение закрываем

// Большая часть работы с оьбъектами ADO.NET происходит

// в отсоединённом режмиме

connection.Close();

}

 

/* Генерация SQL-команд

* Команду SELECT для получения данных мы написали вручную.

* Для выполнения манипуляций с данными для каждой таблицы должны быть

* определены также команды UPDATE, INSERT, DELETE.

* Ничто не мешеат написать их тоже вручную, но это нудно.

* После того, как было установлено соединение с физической таблицей,

* данные, необходимые для генерации этих команд, были получены.

* Для автоматической герерации SQL-команд используется класс

* SqlCommandBuilder

*/

SqlCommandBuilder builder = new SqlCommandBuilder(AdapterExample);

AdapterExample.UpdateCommand =

builder.GetUpdateCommand(true);

 

/* TODO 2.2.

* Переделайте две следующие строки.

* Сгенерируйте команды вставки и удаления так,

* как это сделано с командой изменения данных.

*/

AdapterExample.InsertCommand = builder.GetInsertCommand(true);

AdapterExample.DeleteCommand = builder.GetDeleteCommand(true);

 

}//ConnectToDatabase

 

/* TODO 3.1. Пример работы с объектими DataTable, DataColumn, DataRow.

* Объект класса DataTable содержит таблицу данных,

* ранее загруженную из БД.

* Мы можем работать с этими данными, не устанавливая соединения с БД.

* Как и любая таблица, DataTable состоит из строк и столбцов.

* Они представлены классами DataRow и DataColumn

* * */

 

// Поля для получения данных (нужны для вывода на форму)

public string Surname;

public int Absenses;

 

public void WorkWithDataTableExample()

{

// Надо указать, какой столбец используется в качества

// первичного ключа

ExampleTable.PrimaryKey =

 

new DataColumn[] { ExampleTable.Columns["Id"] };

 

// Получаем строку данных, находя её по указанному

// значению первичного ключа

DataRow row = ExampleTable.Rows.Find(296);

// Получаем значения отдельных столбцов в этой строке

Surname = row["Surname"].ToString();

Absenses = (int)row["ABSENSES"];

 

}//WorkWithDataTableExample

 

/* TODO 3.2. Получение данных при помощи DataTable

* Допишите код метода WorkWithDataTable().

* Получте данные из объекта ExampleTable

* в соответсвии с вариантом задания и запишите их

* в поля StringValue, IntValue (они объявлены ниже).

* * */

 

public string StringValue = "";

public int IntValue = -1;

 

public void WorkWithDataTable()

{

ExampleTable.PrimaryKey = new DataColumn[] { ExampleTable.Columns["Id"] };

DataRow row = ExampleTable.Rows.Find(8);

StringValue = row["SURNAME"].ToString();

IntValue = (int)row["UNDONE_LABS"];

}//WorkWithDataTable

 

/* TODO 4.1. Изменение данных при помощи класса DataTable

* Вносим измененеия в объект класса DataTable,

* а затем передаём их в БД

* * */

 

public void ChangingDataTableExample()

{

// Создаём новую строку данных и заполняем её значениями

DataRow row = ExampleTable.NewRow();

 

// Уникальное значение Id указвать обязательно, т.к. это первичный ключ

// Однако при вставке строки БД сгенерируетсвоё значение ID

row["Id"] = 1000;

 

row["Name"] = "Тарас";

row["Patronimic"] = "Григорович";

row["Surname"] = "Шевченко";

 

//Добавляем строку в набор данных

ExampleTable.Rows.Add(row);

 

// При помощи адаптера изменяем физическую таблицу

AdapterExample.Update(ExampleTable);

}//ChangingDataTableExample

 

 

/* TODO 4.2.

* Допишите код метода ChangingDataTable()

* Выполните добавление данных в таблицу ExampleTable

* и сохраните изменения в физической таблице.

* Для проверки откройте БД в SQL Server Management Studio

* и проверьте, появилась ли ваша строка в физической таблице

* * */

 

public void ChangingDataTable()

{

DataRow row = ExampleTable.NewRow();

row["Id"] = 1000;

row["Name"] = "Лев";

row["Surname"] = "Толстой";

row["UNREASONABLE_ABSENSES"] = 80;

ExampleTable.Rows.Add(row);

AdapterExample.Update(ExampleTable);

}//ChangingDataTableExample

 

 

/* TODO 5.1. Пример простого запроса

* Выполним обычный SQL-запрос к БД,

* возвращающий набор данных

* Во многом похоже на задачу 2

* */

public DataTable SimpleTableExample = new DataTable();

 

public void ExecSimpleQueryExample()

{

// Создаём SQL-команду

SqlCommand simpleQuery = new SqlCommand();

// Связывем её с соедиенеием

simpleQuery.Connection = connection;

 

simpleQuery.CommandType = CommandType.Text;

// Пишем SQL-запрос

simpleQuery.CommandText = "SELECT * FROM Students_One " +

"WHERE Absenses>100";

try

{

// Открываем соединение

connection.Open();

// Читаем данные при помощи метода ExecuteReader()

simpleQuery.ExecuteReader();

}

finally

{

// Закрываем соединение

connection.Close();

}

// Создаём адаптер и связываем его с уже выполненным запросом

SqlDataAdapter adapter;

adapter = new SqlDataAdapter(simpleQuery);

 

// При помощи адаптера заполняем таблицу данных

adapter.Fill(SimpleTableExample);

}//ExecSimpleQueryExample

 

 

/* TODO 5.2. Простой запрос

* Допишите код метода ExecSimpleQuery()

* Выполните SQL-запрос в соответсвии с вариантом задания и

* заполните полученными данными таблицу SimpleTable (объявлена ниже)

* */

 

public DataTable SimpleTable = new DataTable();

 

public void ExecSimpleQuery()

{

SqlCommand simpleQuery = new SqlCommand();

simpleQuery.Connection = connection;

simpleQuery.CommandType = CommandType.Text;

simpleQuery.CommandText = "SELECT * FROM Students_One " +

"WHERE UNREADY_LABS IN(3,6,8,11)";

try

{

connection.Open();

simpleQuery.ExecuteReader();

 

}

finally

{

connection.Close();

}

SqlDataAdapter adapter;

adapter = new SqlDataAdapter(simpleQuery);

 

adapter.Fill(SimpleTable);

 

}//ExecSimpleQuery

 

 

/* TODO 6.1. Пример скалярного запроса

* Скалярный запрос возвращает не набор данных, а отдельное значение

* (строку, число, дату и т.д.)

* Скалярные запросы отличаются методом выполнения

* и способом возврата результатат

* */

public int ScalarResExample;

 

public void ExecScalarExampleQuery()

{

SqlCommand scalarExampleQuery = new SqlCommand();

scalarExampleQuery.Connection = connection;

scalarExampleQuery.CommandType = CommandType.Text;

scalarExampleQuery.CommandText = "SELECT COUNT(*) FROM Students_One";

try

{

connection.Open();

// Запрос выполняется при помощи метода ExecuteScalar()

// Результат приводится к типу int

// и сохраняется в поле ScalarResExample

ScalarResExample = (int)scalarExampleQuery.ExecuteScalar();

}

finally

{

connection.Close();

}

}//ExecScalarExampleQuery

 

/* TODO 6.2. Cкалярный запрос

* Допишите код метода ExecScalarQuery()

* Выполните скалярный запрос в соответсвии с вариантом задания.

* Результат запишите в поле ScalarRes (объявлено ниже)

* */

public int ScalarRes = -1;

 

public void ExecScalarQuery()

{

 

SqlCommand scalarExampleQuery = new SqlCommand();

scalarExampleQuery.Connection = connection;

scalarExampleQuery.CommandType = CommandType.Text;

scalarExampleQuery.CommandText = "SELECT AVG(ABSENSES) FROM Students_One";

try

{

connection.Open();

// Запрос выполняется при помощи метода ExecuteScalar()

// Результат приводится к типу int

// и сохраняется в поле ScalarResExample

ScalarRes = (int)scalarExampleQuery.ExecuteScalar();

}

finally

{

connection.Close();

}

}//ExecScalarQuery

 

/* TODO 7.1. Пример параметризированного запроса

* Параметризированный запрос отличается от обычного тем,

* что данные, используемые в условии выборки,

* определены не при помощи литералов,

* а при помощи параметров,

* значения которых устанавливаются во время выполнения

* */

 

public DataTable ParameterTableExample = new DataTable();

public SqlDataAdapter ParameterAdapterExample;

 

public void ExecParameterQueryExample()

{

SqlCommand parameterQuery = new SqlCommand();

parameterQuery.Connection = connection;

parameterQuery.CommandType = CommandType.Text;

 

// Текст запроса содержит параметр @GroupParam

parameterQuery.CommandText = "SELECT * FROM Students_One "+

"WHERE [Group_Number] = @GroupParam";

 

// Создаём параметр и добавляем его в список параметров запроса,

// определяем тип данных и длину параметра

parameterQuery.Parameters.Add(new SqlParameter("@GroupParam", SqlDbType.VarChar, 6));

 

// Указываем направление: входной параметр

parameterQuery.Parameters["@GroupParam"].Direction = ParameterDirection.Input;

 

// Передаём значение параметра

parameterQuery.Parameters["@GroupParam"].Value = "326";

 

// Выполняем запрос как обычно

try

{

connection.Open();

parameterQuery.ExecuteReader();

}

finally

{

connection.Close();

}

ParameterAdapterExample = new SqlDataAdapter(parameterQuery);

ParameterAdapterExample.Fill(ParameterTableExample);

}//ExecParameterQueryExample

 

/* TODO 7.2. Выполнение параметризированного запроса

* Допришите код метода ExecParameterQuery()

* Выполните параметризированный запрос в соответсвии с вариантом задания

* Заполните таблицу данных ParameterTable

* */

public DataTable ParameterTable = new DataTable();

public SqlDataAdapter ParameterAdapter;

 

public void ExecParameterQuery()

{

 

 

SqlCommand parameterQuery = new SqlCommand();

parameterQuery.Connection = connection;

parameterQuery.CommandType = CommandType.Text;

 

// Текст запроса содержит параметр @GroupParam

parameterQuery.CommandText = "SELECT * FROM STUDENTS_ONE WHERE (ABSENSES>@GroupParam) AND (UNREADY_LABS>=@GroupParam2)";

 

// Создаём параметр и добавляем его в список параметров запроса,

// определяем тип данных и длину параметра

parameterQuery.Parameters.Add(new SqlParameter("@GroupParam", SqlDbType.Int));

 

// Указываем направление: входной параметр

parameterQuery.Parameters["@GroupParam"].Direction = ParameterDirection.Input;

 

// Передаём значение параметра

parameterQuery.Parameters["@GroupParam"].Value = "120";

 

 

parameterQuery.Parameters.Add(new SqlParameter("@GroupParam2", SqlDbType.Int));

parameterQuery.Parameters["@GroupParam2"].Direction = ParameterDirection.Input;

parameterQuery.Parameters["@GroupParam2"].Value = "8";

// Выполняем запрос как обычно

try

{

connection.Open();

parameterQuery.ExecuteReader();

}

finally

{

connection.Close();

}

ParameterAdapter = new SqlDataAdapter(parameterQuery);

ParameterAdapter.Fill(ParameterTable);

 

}//ExecParameterQuery

 

}//class DataAccess

}

 


Дата добавления: 2015-11-04; просмотров: 42 | Нарушение авторских прав




<== предыдущая лекция | следующая лекция ==>
For questions 1-6choose the correct variant. | Varieties of English within the British Isles (Scottish English)

mybiblioteka.su - 2015-2024 год. (0.049 сек.)