Какие фиксированные серверные роли существуют?
Как создать роль БД?
Как осуществляется управление авторизацией?
Как осуществляется управление разрешениями?
Пояснить команды GRANT, REVOKE, DENY.
Лабораторная работа №9. СОЗДАНИЕ КЛИЕНТСКОЙ ЧАСТИ ПРИЛОЖЕНИЯ ДЛЯ БД. Цель работы
Научиться создавать клиентское приложение для работы с базой данных с применением встроенных инструментов на Visual C#.
Содержание работы
Подключение визуальной формы к БД
Привязка элементов формы к sql запросами, хранимым процедурам и функциям
Задание к работе
Для базы данных из работы №2 создать клиентское приложение, которое реализует добавление, удаление и обновление информации из БД. Также форму по работе с хранимыми процедурами и функциями: добавить на форму кнопки, реализующие хранимые процедуры и пользовательские функции из работы 5, а так же поля ввода для входных параметров и поля для вывода результатов.
Рис. 40. Интерфейс приложения
Краткая Теория
Подключение к Базе данных
Рассмотрим как подключать базу данных sql server к программе на C# через Visual Studio.
Создаем новый проект Visual C# – приложение для Windows.
Рис. 41. Новый проект
В проекте выбираем меню Tools => Connect to DataBase (Сервис- Подключить к Базе данных).
Выбираем источник данных (DataSet): Microsoft SQL Server.
Рис. 42. Выбор источника данных
В открывшемся окне в поле Источник данных (Data Source) ставим Microsoft SQL Server, в поле Server Name –amd-sql\stufent, далее в поле Select or enter DB name выберите имя БД, к которой будем подключаться, и нажмите OK.
Рис. 43. Источник данных
Теперь открыв окно Обозреватель серверов (Server explorer) можно увидеть подключенную БД. Нажав на нее, в окне свойств копируем Connection String, она еще пригодится.
В конструкторе создаем новую форму, на нее добавляем компонент DataGridView:
Рис. 44. Добавление формы данных
Во вкладке Свойства находим Данные (Data) – DataSet - выберем Добавить источник данных проекта(Add New Data Source). В появившемся окне выберем База данных( DataBase) .
Рис. 45. Добавление базы данных
Нажмем Далее(Next).
Выбираем: "Набор данных" и жмем кнопочку "Далее":
Рис. 46. Добавление набора данных
Выбираем нашу БД, жмем Next.
Рис. 47. Добавление файла БД
В следующем диалоге опять жмем "Далее":
Рис. 48. Сохранение подключения
После чего у нас появиться список данных, доступных для выбора:
Рис. 49. Выбор таблицы БД
Выберем созданную нами таблицу:
Рис. 50. Выбор столбцов таблицы
После нажатия кнопочки "Готово" у нас в компоненте DataGridView отобразятся столбцы выбранной таблицы:
Рис. 51. Связка с DataGridView
Теперь мы можем запустить программу и даже редактировать данные в таблице базы данных.
Рис. 52. Итоговое приложение
ADO.NET
Платформа .NET определяет ряд пространств имен, которые позволяют непосредственно взаимодействовать с локальными и удаленными базами данных. Вместе эти пространства имен известны как ADO.NET. Рассмотрим два уровня работы с ADO.NET: подключенный уровень (connected layer) - позволяет взаимодействовать с базой данных с помощью объектов подключения, чтения данных и команд конкретного поставщика данных; отключенный уровень (disconnected layer) - позволяет смоделировать в памяти данные из базы данных с помощью многочисленных классов из пространства имен System.Data (DataSet, DataTable и т.д.)
ADO.NET поставляется с тремя пространствами имен клиента базы данных: одно для SQL Server, другое для источников данных Open Database Connectivity (ODBC) и третье для любой базы данных, доступной через OLE DB. [7]
Поставщики данных в ADO.NET
Поставщик данных (data provider) — это набор классов ADO.NET, которые позволяют получать доступ к определенной базе данных, выполнять команды SQL и извлекать данные. По сути, поставщик данных
— это мост между вашим приложением и источником данных.
Таблица 6 Основные объекты поставщиков данных ADO.NET
Тип
объекта
|
Базовый класс
|
Соответствующие
интерфейсы
|
Назначение
|
Connection
|
DbConnection
|
IDbConnection
|
Позволяет подключаться к хранилищу данных и отключаться от него. Кроме того, объекты
подключения
|
|
|
|
обеспечивают доступ к соответствующим
объектам транзакций
|
Command
|
DbCommand
|
IDbCommand
|
Представляет SQL- запрос или хранимую процедуру. Кроме того, объекты команд предоставляют доступ к объекту чтения данных конкретного поставщика
данных
|
DataReader
|
DbDataReader
|
IDataReader, IDataRecord
|
Предоставляет доступ к данным только для чтения в прямом направлении с помощью курсора на стороне
сервера
|
DataAdapter
|
DbDataAdapter
|
IDataAdapter, IDbDataAdapter
|
Пересылает наборы данных из хранилища данных к вызывающему процессу и обратно. Адаптеры данных содержат подключение и набор из четырех внутренних объектов команд для выборки, вставки, изменения и удаления информации в
хранилище данных
|
Parameter
|
DbParameter
|
IDataParameter, IDbDataParameter
|
Представляет именованный параметр в параметризованном
запросе
|
Transaction
|
DbTransaction
|
IDbTransaction
|
Инкапсулирует транзакцию в базе
данных
|
Фундаментальные классы ADO.NET
Классы ADO.NET группируются в несколько пространств имен. Каждый поставщик имеет свое собственное пространство имен, а обобщенные классы вроде DataSet находятся в пространстве имен
System.Data. Ниже описаны наиболее важные пространства имен для базовой поддержки ADO.NET:
System.Data
Содержит ключевые классы контейнеров данных, которые моделируют столбцы, отношения, таблицы, наборы данных, строки, представления и ограничения. Дополнительно содержит ключевые интерфейсы, которые реализованы объектами данных, основанными на соединениях.
System.Data.Common
Содержит базовые, наиболее абстрактные классы, которые реализуют некоторые из интерфейсов из System.Data и определяют ядро функциональности ADO.NET. Поставщики данных наследуются от этих классов (DbConnection, DbCommand и т.п.), создавая собственные специализированные версии.
System.Data.OleDb
Содержит классы, используемые для подключения к поставщику OLE DB, включая OleDbCommand, OleDbConnection и OleDbDataAdapter. Эти классы поддерживают большинство поставщиков OLE DB, но не те, что требуют интерфейсов OLE DB версии 2.5
System.Data.SqlClient
Содержит классы, используемые для подключения к базе данных Microsoft SQL Server, в том числе SqlDbCommand, SqlDbConnection и SqlDbDataAdapter. Эти классы оптимизированы для использования интерфейса TDS к SQL Server
System.Data.OracleClient
Содержит классы, необходимые для подключения к базе данных Oracle (версии 8.1.7 и выше), в том числе OracleCommand, OracleConnection и OracleDataAdapter. Эти классы используют оптимизированный интерфейс OCI (Oracle Call Interface – Интерфейс вызовов Oracle)
System.Data.Odbc
Содержит классы, необходимые для подключения к большинству драйверов ODBC, такие как OdbcCommand, OdbcConnection, OdbcDataReader и OdbcDataAdapter. Драйверы ODBC поставляются для всех видов источников данных и конфигурируются через значок Data Sources (Источники данных) панели управления
System.Data.SqlTypes
Содержит структуры, соответствующие встроенным типам данных SQL Server. Эти классы не являются необходимыми, но предоставляют альтернативу применению стандартных типов данных .NET, требующих автоматического преобразования. [3]
Использование SQL команд
Для того, чтобы команда исполнилась, нужно ввести текст команды, затем определить ее тип и привязать к соединению. Рассмотрим какие бывают типы команд:
Text – выполнится текст SQL оператора StoredProcedure – выполнится хранимая процедура TableDirect – вернет все записи в таблице
using System.Data;
Для того, чтобы установить тип процедуры нужно подключить пространство имен:
Теперь рассмотрим пример вызова текстовой sql команды:
Но для более короткой записи можно использовать конструктор SqlCommand, так как он по умолчанию имеет тип Text.
Если вы хотите сократить запись команды, которая вызывает хранимую процедуру, то можете использовать следующий код:
Этот код вызывает хранимую процедуру GetAllStudents. [7]
В приведенном выше коде, команда создается, но не выполняется.
Существует три способа как вызвать SQL оператор:
ExecuteNonQuery() – используется для вызова команд удаления, вставки и обновления записей, возвращает количество обработанных записей
ExecuteScalar() – выполняет SQL оператор и возвращает значение первого поля первой строки
ExecuteReader() – выполняет запрос SELECT и возвращает объект DataReader, который содержит результат выполнения команды
Теперь необходимо ознакомиться к контейнером данных DataReader.
Рассмотрим его методы:
Read() – метод считывает следующую строку. Возвращает true, если существует следующая строка, и false в противном случае. Необходимо вызвать его перед началом чтения данных
GetValue() – возвращает значение указанного элемента в строке. Имеется возможность обращаться к элементу как по номеру, так и по имени.GetValue(«ID»); и GetValue(0) эквивалентные вызовы в нашей таблице.
GetValues() – сохраняет значения строки в массив
NextResult() – возвращает следующий набор данных, если в сгенерированном DataReader более одного набора
Close () – закрывает модуль чтения. [3]
Пример использования SqlCommand для возврата количества строк в таблице:
string connStr = "Data Source=MyServer;Initial Catalog=MyDb;Integrated Security=SSPI";
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM MyTable", conn);
conn.Open();
int numRows = (int) cmd.ExecuteScalar(); Console.WriteLine("Количество строк в MyTable: " + numRows);
conn.Close();
}
Пример использования SqlCommand для обновления таблицы: string connStr = "Data Source=MyServer;Initial
Catalog=MyDb;Integrated Security=SSPI";
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlCommand cmd = new SqlCommand("UPDATE MyTable SET Price = Price * 2", conn);
conn.Open();
int numRows = cmd.ExecuteNonQuery();
Console.WriteLine("Количество обновлённых строк: " + numRows);
conn.Close();
}
Для возврата результата может быть использован класс
SqlDataReader (System.Data.SqlClient.SqlDataReader).
Этот класс предоставляет возможность чтения вперёд результирующего набора строк с возможностью обратиться к каждой строке. Класс использует понятие текущей записи. Для доступа к значениям полей текущей записи могут использоваться индексаторы по номеру поля (начиная с нуля) или по имени (не рекомендуется), а также набор методов Get[DataType], которые возвращают преобразованные к DataType значения полей. В момент чтения подключение должно быть активно. При необходимости последующего использования подключения вызывается SqlDataReader.Close(), если подключение не нужно, то SqlConnection.Dispose(). [6]
Пример использования SqlDataReader для чтения результирующего набора данных:
string queryStr = "SELECT ID, S, N FROM MyTable";
string connStr = "Data Source=MyServer;Initial Catalog=MyDb;Integrated Security=SSPI";
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlCommand cmd = new SqlCommand(queryStr, conn); conn.Open();
SqlDataReader r = cmd.ExecuteReader();
// Чтение данных while (r.Read())
{
Console.WriteLine(
// форматированный вывод String.Format("ID:{0}, S:{1}, N:{2}",
// доступ к значению по индексатору с номером поля r[0],
// доступ к значению по индексатору с именем поля r["S"],
// доступ к значению с использованием методов Get r.GetString(2) //
));
}
// Вызов Close() после завершения чтения r.Close();
}
Пример привязки хранимой процедуры к кнопке
В sql server есть БД students: таблица Stud с полями: id(счетчик), fio, age), а также хранимая процедура по имени inesrt_d. Тело хранимой процедуры:
CREATE PROCEDURE inesrt_d @nm nvarchar(50),
@ag INT AS
BEGIN TRANSACTION
INSERT INTO Stud (fio,age) VALUES (@nm,@ag);
COMMIT TRANSACTION;
Имеется форма(C#), на ней textbox1 для fio ,textbox2 для age и кнопка button1.
Осуществлена привязка к форме бд students с помощью визуального подключения visual studio 2010 ( Add New Data Source...), т.е. реализована работа с бд в автономном уровне.
Необходимо привязать к button1 хранимую процедуру для ее вызова, привязать к текстбоксам входные параметры хранимой процедуры.
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data;
using System.Drawing; using System.Linq; using System.Text;
using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Insert(textBox1.Text,Int32.Parse(textBox2.Text));
}
private bool Insert(string fio, int age)
{
bool result = false;
using (SqlConnection con = new SqlConnection(/* zapishi connection string*/))
{
SqlCommand cmd = new SqlCommand(); cmd.Connection = con; cmd.CommandText = "inesrt_d";
cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("pfio", fio); cmd.Parameters.AddWithValue("pAge", age);
try
{
con.Open();
if (cmd.ExecuteNonQuery() == 1)
{
result = true;
}
}
catch { } return result;
}
}
}
}
Достарыңызбен бөлісу: |