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