Студопедия

Главная страница Случайная страница

Разделы сайта

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






Благодарности 20 страница






В следующем диалоговом окне Вам нужно будет создать соединение с источником данных (рис. 9-17).

Рис. 9-17. Создание соединения с источником данных

Чтобы создать соединение, щелкните кнопку New Connection. На экране появится диалоговое окно Data Link Properties, открытое на вкладке Connection (рис. 9-18).

Рис. 9-18. Выбор параметров соединения с источником данных

В списке Select or enter a server name Вы должны указать сервер SQL, к которому будет подключаться Ваше приложение. Если это тот сервер работает на том же компьютере, что и приложение, укажите здесь строку localhost.

Далее, отметьте флажок Use a specific user name and password, после чего введите в поле User name строку c_sharp_app. Задайте также в поле Password пароль пользователя c_sharp_app.

Чтобы позволить приложению сохранить пароль, отметьте флажок Allow saving password. Избегайте установки этого флажка, если к безопасности предъявляются повышенные требования.

Далее отметьте флажок Select the database on the server и выберите в списке, расположенном под этим флажком, нашу базу данных PhoneBook.

На этом создание соединения с источником данных завершено. Обязательно проверьте его работоспособность, щелкнув кнопку Test Connection. Если все нормально, Вы получите сообщение с текстом Test connection succeed.

Проверив соединение, щелкните кнопку OK. На экране появится диалоговое окно SQL Server Login (рис. 9-19).

Рис. 9-19. Подключение к серверу SQL

В поле Password этого окна Вам нужно ввести пароль пользователя c_sharp_app, а затем щелкнуть кнопку OK. Теперь в списке соединений появится название нового, только что созданного Вами соединения (рис. 9-20).

Рис. 9-20. Выбрано созданное и проверенное соединение

Щелкните кнопку Next для перехода к следующему окну мастера соединений.

На экране появится диалоговое окно с флажками, в котором Вам нужно будет определить тип запроса, т.е. способ, которым будет пользоваться адаптер SqlDataAdapter для извлечения данных из сервера SQL (рис. 9-21).

Рис. 9-21. Выбор типа запроса

Для извлечения данных Вы можете использовать запрос, составленный на языке SQL, новую или существующую хранимую процедуру сервера Microsoft SQL Server. В нашем случае мы воспользуемся простой командой SELECT языка SQL, поэтому отметьте флажок Use SQL statements, а затем щелкните кнопку Next.

На экране появиться очередное окно мастера, показанное на рис. 9-22. Это окно позволит Вам ввести текст сценария SQL для извлечения данных.

Рис. 9-22. Окно ввода сценария SQL

Введите в этом окне следующую строку:

SELECT id, FirstName, LastName FROM Contacts

Щелкнув кнопку Query Builder, Вы сможете создать строку запроса SQL при помощи мастера сценариев SQL, главное окно которого показано на рис. 9-23.

Рис. 9-23. Мастер сценариев SQL

Нужного нам результата можно добиться, просто отметив флажки всех строк таблицы Contacts.

Щелкнув кнопку Next в окне мастера, показанном на рис. 9-22, Вы перейдете к финальному окну, показанному на рис. 9-24.

Рис. 9-24. Адаптер создан

Для завершения процедуры создания адаптера щелкните в нем кнопку Finish.

Программный код для адаптера и соединения

Рассмотрим программный код, добавленный мастером в проект в результате всех наших действий.

Прежде всего, обратите внимание, что теперь к проекту был автоматически добавлен программный компонент sqlConnection1. Этот компонент обеспечивает соединение с источником данных.

Мастер создал в классе Form1 несколько полей для хранения ссылок на объекты адаптера sqlDataAdapter1, соединения sqlConnection1, а также команд SQL, предназначенных для выборки (sqlSelectCommand1), вставки (sqlInsertCommand1), обновления (sqlUpdateCommand1) и удаления (sqlDeleteCommand1) строк таблицы:

private System.Data.SqlClient.SqlDataAdapter sqlDataAdapter1;
private System.Data.SqlClient.SqlCommand sqlSelectCommand1;
private System.Data.SqlClient.SqlCommand sqlInsertCommand1;
private System.Data.SqlClient.SqlCommand sqlUpdateCommand1;
private System.Data.SqlClient.SqlCommand sqlDeleteCommand1;
private System.Data.SqlClient.SqlConnection sqlConnection1;

Инициализация всех этих компонентов осуществляется методом InitializeComponent, исходный текст которого по умолчанию скрыт от разработчика. Давайте раскроем эти «секреты».

Прежде всего, в процессе инициализации метод InitializeComponent создает перечисленные выше объекты при помощи соответствующих конструкторов:

this.sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter();
this.sqlSelectCommand1 = new System.Data.SqlClient.SqlCommand();
this.sqlInsertCommand1 = new System.Data.SqlClient.SqlCommand();
this.sqlUpdateCommand1 = new System.Data.SqlClient.SqlCommand();
this.sqlDeleteCommand1 = new System.Data.SqlClient.SqlCommand();
this.sqlConnection1 = new System.Data.SqlClient.SqlConnection();

Далее выполняется настройка свойств адаптера sqlDataAdapter1.

Программа подключает к адаптеру объекты, при помощи которых выполняются операции удаления, вставки, выборки и обновления данных:

this.sqlDataAdapter1.DeleteCommand = this.sqlDeleteCommand1;
this.sqlDataAdapter1.InsertCommand = this.sqlInsertCommand1;
this.sqlDataAdapter1.SelectCommand = this.sqlSelectCommand1;
this.sqlDataAdapter1.UpdateCommand = this.sqlUpdateCommand1;

После этого необходимо настроить свойство TableMappings адаптера. Это свойство задает соответствие между таблицами источника данных (сервера SQL) и таблицами локального набора данных DataSet.

В нашем случае источник данных представляет собой таблицу Contacts. Эта таблица отображается на таблицу набора DataSet с именем Table:

this.sqlDataAdapter1.TableMappings.AddRange(
new System.Data.Common.DataTableMapping[]
{
new System.Data.Common.DataTableMapping(
" Table", " Contacts",
new System.Data.Common.DataColumnMapping[]
{
new System.Data.Common.DataColumnMapping(" id", " id"),
new System.Data.Common.DataColumnMapping(" FirstName",
" FirstName"),
new System.Data.Common.DataColumnMapping(" LastName",
" LastName")
}
)
}
);

При этом программа отображает каждый столбец источника данных на одноименный столбец набора данных DataSet.

Уже после создания адаптера Вы сможете изменить отображение, отредактировав свойство TableMappings. Это можно сделать с помощью редактора, показанного на рис. 9-25.

Рис. 9-25. Редактирование отображения таблиц

Здесь список SourceTable задает исходную таблицу локального набора данных DataSet, а список Dataset table — таблицу источника данных.

На следующем этапе программа инициализации готовит команды для выполнения операций с источником данных, таких как извлечение, вставка, обновление и удаление. Вот в каком виде готовится команда извлечения данных:

//
// sqlSelectCommand1
//
this.sqlSelectCommand1.CommandText =
" SELECT id, FirstName, LastName FROM dbo.Contacts";
this.sqlSelectCommand1.Connection = this.sqlConnection1;

Текст команды, составленный на языке SQL, записывается в свойство CommandText объекта sqlSelectCommand1. Так как команда имеет отношение к вполне определенному соединению с источником данных, в свойство Connection записывается ссылка на соединение sqlConnection1. Об инициализации соединения мы расскажем чуть позже.

Аналогичным образом готовятся и остальные команды.

Вот, например, как выглядит инициализация команда вставки строк:

//
// sqlInsertCommand1
//
this.sqlInsertCommand1.CommandText =
" INSERT INTO dbo.Contacts(FirstName, LastName) VALUES (@FirstName, @LastName); SEL" +
" ECT id, FirstName, LastName FROM dbo.Contacts WHERE (id = @@IDENTITY)";
this.sqlInsertCommand1.Connection = this.sqlConnection1;

Обратите внимание, что для вставки используются параметры @FirstName и @LastName. Они определяют содержимое ячеек вставляемых строк.

Параметры добавляются в свойство sqlInsertCommand1.Parameters при помощи метода Add:

this.sqlInsertCommand1.Parameters.Add(
new System.Data.SqlClient.SqlParameter(" @FirstName",
System.Data.SqlDbType.VarChar, 50, " FirstName"));

this.sqlInsertCommand1.Parameters.Add(
new System.Data.SqlClient.SqlParameter(" @LastName",
System.Data.SqlDbType.VarChar, 50, " LastName"));

При этом каждый параметр команды SQL создается в виде объекта класса System.Data.SqlClient.SqlParameter.

В качестве первого параметра (извиняемся за тавтологию) конструктору передается имя параметра команды SQL, снабженное префиксом @. Второй параметр задает тип данных, третий — размер данных, и, наконец, четвертый — имя соответствующего столбца в источнике данных. Заметим, что в классе System.Data.SqlClient.SqlParameter есть еще несколько перегруженных конструкторов, описание которых Вы найдете в документации.

Команда обновления данных также имеет параметры:

//
// sqlUpdateCommand1
//
this.sqlUpdateCommand1.CommandText =
" UPDATE dbo.Contacts SET FirstName = @FirstName, LastName = @LastName WHERE (id = " +
" @Original_id) AND (FirstName = @Original_FirstName) AND (LastName = @Original_La" +
" stName); SELECT id, FirstName, LastName FROM dbo.Contacts WHERE (id = @id)";

this.sqlUpdateCommand1.Connection = this.sqlConnection1;

this.sqlUpdateCommand1.Parameters.Add(
new System.Data.SqlClient.SqlParameter(" @FirstName",
System.Data.SqlDbType.VarChar, 50, " FirstName"));

this.sqlUpdateCommand1.Parameters.Add(
new System.Data.SqlClient.SqlParameter(" @LastName",
System.Data.SqlDbType.VarChar, 50, " LastName"));

this.sqlUpdateCommand1.Parameters.Add(
new System.Data.SqlClient.SqlParameter(" @id",
System.Data.SqlDbType.Int, 4, " id"));

this.sqlUpdateCommand1.Parameters.Add(
new System.Data.SqlClient.SqlParameter(" @Original_id",
System.Data.SqlDbType.Int, 4,
System.Data.ParameterDirection.Input, false, ((System.Byte)(0)),
((System.Byte)(0)), " id", System.Data.DataRowVersion.Original,
null));

this.sqlUpdateCommand1.Parameters.Add(
new System.Data.SqlClient.SqlParameter(" @Original_FirstName",
System.Data.SqlDbType.VarChar, 50,
System.Data.ParameterDirection.Input, false, ((System.Byte)(0)),
((System.Byte)(0)), " FirstName",
System.Data.DataRowVersion.Original, null));

this.sqlUpdateCommand1.Parameters.Add(
new System.Data.SqlClient.SqlParameter(" @Original_LastName",
System.Data.SqlDbType.VarChar, 50,
System.Data.ParameterDirection.Input, false, ((System.Byte)(0)),
((System.Byte)(0)), " LastName",
System.Data.DataRowVersion.Original, null));

Как видите, для команды обновления требуется больше параметров. Наряду с параметрами, задающими новые значения для ячеек обновляемой строки @FirstName, @LastName и @id, необходимо передать исходные значения упомянутых ячеек посредством параметров @Original_FirstName, @Original_LastName и @Original_id.

Для передачи параметров с исходными значениями используется перегруженный вариант конструктора класса System.Data.SqlClient.SqlParameter, имеющий 10 параметров.

В частности, четвертый параметр задает направление передачи данных как System.Data.ParameterDirection.Input. Таким образом, здесь добавляются не выходные, а входные параметры. После выполнения команды эти параметры будут содержать исходные значения ячеек, какими они были до выполнения команды.

Команда удаления также имеет входные параметры:

//
// sqlDeleteCommand1
//
this.sqlDeleteCommand1.CommandText =
" DELETE FROM dbo.Contacts WHERE (id = @Original_id) AND (FirstName = @Original_Fir" +
" stName) AND (LastName = @Original_LastName)";

this.sqlDeleteCommand1.Connection = this.sqlConnection1;

this.sqlDeleteCommand1.Parameters.Add(
new System.Data.SqlClient.SqlParameter(" @Original_id",
System.Data.SqlDbType.Int, 4,
System.Data.ParameterDirection.Input, false, ((System.Byte)(0)),
((System.Byte)(0)), " id", System.Data.DataRowVersion.Original,
null));

this.sqlDeleteCommand1.Parameters.Add(
new System.Data.SqlClient.SqlParameter(" @Original_FirstName",
System.Data.SqlDbType.VarChar, 50,
System.Data.ParameterDirection.Input, false, ((System.Byte)(0)),
((System.Byte)(0)), " FirstName",
System.Data.DataRowVersion.Original, null));

this.sqlDeleteCommand1.Parameters.Add(
new System.Data.SqlClient.SqlParameter(" @Original_LastName",
System.Data.SqlDbType.VarChar, 50,
System.Data.ParameterDirection.Input, false, ((System.Byte)(0)),
((System.Byte)(0)), " LastName",
System.Data.DataRowVersion.Original, null));

Через эти параметры команда передает исходные значения ячеек удаляемой строки.

Команды и параметры удобно редактировать не в исходном тексте приложения, а при помощи соответствующих графических средств.

Для редактирования параметров, например, команды обновления данных, раскройте список этих параметров в окне свойств объекта sqlDataAdapter1, как это показано на рис. 9‑ 26.

Рис. 9-26. Редактирование параметров команды обновления данных

Для изменения команды SQL, выполняющей обновление данных, отредактируйте здесь свойство CommandText. При этом на экране появится редактор запросов Query Builder, окно которого показано на рис. 9-27.

Рис. 9-27. Редактор запросов Query Builder

С помощью этого редактора можно внести все необходимые изменения в текст команды SQL.

Для изменения параметров команды SQL отредактируйте свойство Parameters. При этом на экране появится редактор параметров, показанный на рис. 9-28.

Рис. 9-28. Редактор параметров команды SQL

И, наконец, рассмотрим программный код, который используется для установки параметров соединения с источником данных:

//
// sqlConnection1
//
this.sqlConnection1.ConnectionString =
" data source=localhost; initial catalog=PhoneBook;
password=12345; persist security i" +
" nfo=True; user id=c_sharp_app; workstation id=DR4;
packet size=4096";

Как видите, в свойство ConnectionString объекта sqlConnection1 записывается довольно длинная строка, содержащая значения параметров соединения. Каждый такой параметр задается при помощи строк имени и значения, объединенных оператором присваивания. Отдельные параметры в этой строке разделены символом точка с запятой.

Назначения некоторых параметров строки соединения мы привели в табл. 9-1.

Таблица 9-1. Параметры строки соединения

Имя Описание
data source Этот параметр может также задаваться как Server, Address, Addr или Network Address. Он задает имя или сетевой адрес узла сети, на котором работает сервер SQL
initial catalog Может задаваться как Database. Этот параметр определяет имя базы данных, с которой осуществляется соединение
password Может задаваться как Pwd. Задает пароль для подключения к базе данных.
persist security info Когда значение этого параметра равно false, парольная информация не включается в параметры соединения
user id Идентификатор для подключения к серверу SQL
workstation id Локальное имя рабочей станции, подключающейся к серверу SQL
packet size Размер пакетов данных (в байтах), используемых для обмена данными с сервером SQL
Application Name Имя приложения или провайдера данных.Net SqlClient Data Provider
AttachDBFilename Может задаваться как extended properties или Initial File Name. Полный путь и имя файла базы данных. При использовании этого параметра имя базы данных должно быть задано с использованием параметра Database
Connect Timeout Может задаваться как Connection Timeout. Продолжительность периода ожидания ответа от сервера перед выдачей сообщения об ошибке
Connection Lifetime Время жизни соединения
Connection Reset Режим автоматического завершения соединения
Current Language Текущий национальный язык для сервера SQL
Network Library Может задаваться как Net. Этот параметр задает сетевую библиотеку, используемую для установки соединения с сервером SQL. Здесь можно указывать значения dbnmpntw (Named Pipes), dbmsrpcn (Multiprotocol), dbmsadsn (Apple Talk), dbmsgnet (VIA), dbmsipcn (Shared Memory), dbmsspxn (IPX/SPX), и dbmssocn (TCP/IP)

Создание локального набора DataSet

Вернемся к нашему приложению SQLTestApp. На данный момент мы создали базу данных и проект приложения, а также добавили в проект адаптер данных и настроили соединение с источником данных. Теперь нашей задачей будет создание локального набора данных DataSet, отображаемого на базу данных, размещенную на сервере SQL.

Для этого щелкните правой клавишей мыши форму Вашего приложения и выберите из контекстного меню строку Generate DataSet. На экране появится одноименное диалоговое окно, показанное на рис. 9-29.

Рис. 9-29. Создание набора данных DataSet

Вам нужно отметить флажок New. При необходимости Вы также можете изменить имя набора данных в поле, расположенном справа от этого флажка.

Убедитесь также, что в списке Choose which table(s) to add to the dataset, определяющим таблицы, добавляемые в набор данных, выбрана таблица Contacts. Отметьте также флажок Add this dataset to the designer.

После того как Вы щелкните кнопку OK, будет создан и добавлен в проект приложения набор данных dataSet11.

Помимо этого к проекту приложения будет добавлена схема набора данных в виде файла DataSet1.xsd. Этот файл содержит описание таблицы на языке XML.

Если попытаться открыть файл DataSet1.xsd для редактирования, то в окне Microsoft Visual Studio.NET эта схема появится в виде таблицы (рис. 9-30).

Рис. 9-30. Редактирование схемы набора данных в визуальном режиме

Ячейки этой таблицы поддаются редактированию. На вкладке XML (рис. 9-30) Вы сможете отредактировать файл схемы:

<? xml version=" 1.0" standalone=" yes"? >
< xs: schema id=" DataSet1" targetNamespace=" https://www.tempuri.org/DataSet1.xsd" xmlns: mstns=" https://www.tempuri.org/DataSet1.xsd" xmlns=" https://www.tempuri.org/DataSet1.xsd" xmlns: xs=" https://www.w3.org/2001/XMLSchema" xmlns: msdata=" urn: schemas-microsoft-com: xml-msdata" attributeFormDefault=" qualified" elementFormDefault=" qualified" >
< xs: element name=" DataSet1" msdata: IsDataSet=" true" msdata: Locale=" ru-RU" >
< xs: complexType>
< xs: choice maxOccurs=" unbounded" >
< xs: element name=" Contacts" >
< xs: complexType>
< xs: sequence>
< xs: element name=" id" msdata: ReadOnly=" true" msdata: AutoIncrement=" true" type=" xs: int" />
< xs: element name=" FirstName" type=" xs: string" />
< xs: element name=" LastName" type=" xs: string" />
< /xs: sequence>
< /xs: complexType>
< /xs: element>
< /xs: choice>
< /xs: complexType>
< xs: unique name=" Constraint1" msdata: PrimaryKey=" true" >
< xs: selector xpath=".//mstns: Contacts" />
< xs: field xpath=" mstns: id" />
< /xs: unique>
< /xs: element>
< /xs: schema>

Детальное описание содержимого этого файла выходит за рамки нашей книги. Заметим только, что у Вас нет необходимости редактировать этот файл вручную, т.к. можно воспользоваться визуальным редактором, показанным на рис. 9-30.

Редактирование содержимого набора DataSet

Теперь нам нужно предусмотреть в нашем приложении средство просмотра и редактирования созданного на предыдущем этапе набора данных DataSet. Проще всего это сделать при помощи элемента управления DataGrid, о котором мы подробно рассказывали в предыдущей главе.

Итак, перетащите мышью элемент управления DataGrid из панели Toolbox и расположите его внутри формы приложения.

Далее Вам будет нужно отредактировать свойства DataGrid, чтобы привязать его к набору данных DataSet.

Прежде всего, установите значение свойства DataSource, равным dataSet11.

Далее установите значение свойства DataMember, определяющим имя таблицы, равным Contacts. Для этого выберите таблицу Contacts в окне, появляющемся на экране при редактировании свойства DataMember.

Загрузка набора данных

Добавьте в форму приложения кнопку с надписью Загрузить, а затем создайте для нее следующий обработчик событий:

private void button1_Click(object sender, System.EventArgs e)
{
try
{
dataSet11.Clear();
sqlDataAdapter1.Fill(dataSet11);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, " Ошибка");
}
}

Первым делом этот обработчик событий очищает элемент управления dataSet11, удаляя из него все строки.

Далее он загружает данных из источника данных в локальный набор данных dataSet11 с помощью адаптера sqlDataAdapter1 и метода Fill.

Так как при работе с сервером SQL могут возникать различные ошибки, приводящие к возникновению исключений, мы предусмотрели обработчик таких исключений. Этот обработчик выводит на экран текст сообщения об ошибке.

Сохранение отредактированного набора данных

Для того чтобы пользователь нашего приложения мог сохранять содержимое локального набора данных DataSet в базе данных, расположенной на сервере, добавьте в форму приложения кнопку с надписью Обновить.

Создайте для этой кнопки следующий обработчик событий:

private void button2_Click(object sender, System.EventArgs e)
{
try
{
sqlDataAdapter1.Update(dataSet11);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, " Ошибка");
}
}

Он сохраняет содержимое набора данных dataSet11 в источнике данных при помощи адаптера sqlDataAdapter1 и метода Update.

Теперь Вы можете испытать приложение в работе (рис. 9-31).

Рис. 9-31. Приложение SQLTestApp в действии

Если при попытке загрузить или сохранить данные появляются сообщения об ошибке, Вам надо проанализировать их текст. Ошибки могут возникать из-за того, что Вы неточно следовали нашим рекомендациям по созданию приложения или из-за ошибок, допущенных при установке или настройке севера SQL. В частности, проверьте идентификатор и пароль, использованные для подключения к базе данных, а также настройку прав доступа к базе данных и таблице Contacts.

Парольный доступ к системе

Как правило, коммерческие приложения с базами данных содержат в себе те или иные средства разграничения доступа. Чаще всего эти средства основаны на использовании идентификаторов и паролей. Чтобы получить доступ к системе, пользователь должен ввести свой идентификатор и пароль.

В базе данных приложения может быть предусмотрена специальная таблица, хранящая идентификаторы (логины) и пароли (или, что лучше, хэш-функции паролей). Системный администратор наделяется правами редактирования таблицы идентификаторов и паролей, а остальные пользователи не имеют к ней прямого доступа.

Приложение LoginApp

В этом разделе мы создадим приложение LoginApp, предназначенное для создания и редактирования таблицы идентификаторов и паролей пользователей. Сама таблица с названием Users при этом хранится на сервере SQL. Для доступа к ней мы используем адаптер SqlDataAdapter, рассмотренный в предыдущих разделах этой главы, а также класс SqlDataReader.

При этом адаптер SqlDataAdapter мы будем использовать для получения и обновления содержимого таблицы Users, а класс SqlDataReader — для проверки идентификатора и пароля пользователя.

Внешний вид окна приложения LoginApp показан на рис. 9-32.

Рис. 9-32. Приложение LoginApp

В верхней части окна находятся поля, предназначенные для ввода идентификатора и пароля, а также кнопка Войти. Для того чтобы получить доступ к редактированию таблицы Users, пользователь (играющий роль администратора) должен ввести свой идентификатор и пароль, а затем нажать кнопку Войти.

При самом первом подключении к системе идентификатор и пароль вводить не надо. При этом наше приложение автоматически создаст в таблице Users строку администратора с идентификатором admin и паролем password, отображая на экране сообщение об этом событии (рис. 9-33). Данную парольную информацию можно будет затем использовать для первого подключения к системе, изменив ее в дальнейшем.

Рис. 9-33. Эта учетная запись создается автоматически

Если в таблице Users уже есть хотя бы одна запись, необходимо ввести правильный идентификатор и пароль. В этом случае содержимое таблицы Users будет отображено в окне приложения с помощью адаптера SqlDataAdapter и элемента управления DataGrid.

Помимо идентификаторов и паролей пользователей таблица Users хранит код доступа каждого пользователя. В нашем приложении пользователям с кодом доступа 80 разрешается модифицировать таблицу Users, а всем остальным пользователям — только просматривать содержимое этой таблицы.

Для сохранения изменений в таблице Users, расположенной на сервере SQL, мы предусмотрели кнопку Обновить. Эта кнопка, однако, будет разблокирована только в том случае, если код доступа пользователя равен 80.

Таблица Users

Прежде чем приступить к созданию приложения LoginApp Вам нужно будет создать в базе данных PhoneBook (с которой мы работали раньше) новую таблицу Users.

В таблице Users нужно предусмотреть столбцы id, Login, Password и assess. На рис. 9-34 мы показали таблицу Users в окне дизайнера таблиц утилиты SQL Server Enterprise Manager.

Рис. 9-34. Таблица Users

Столбец id предназначен для хранения первичного ключа. Столбцы Login и Password хранят, соответственно, идентификатор пользователя и пароль. Что же касается столбца access, то он хранит код доступа в виде целого числа. Если этот код равен 80, пользователю разрешается модифицировать таблицу Users, а если нет — только просматривать.

Ниже мы привели сценарий SQL, с помощью которого можно создать таблицу Users и определить для нее первичный ключ:

CREATE TABLE [dbo].[Users] (
[id] [int] IDENTITY (0, 1) NOT NULL,
[Login] [varchar] (50) COLLATE Cyrillic_General_CI_AS NOT NULL,
[Password] [varchar] (50) COLLATE Cyrillic_General_CI_AS NOT NULL,
[access] [int] NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Users] WITH NOCHECK ADD
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
GO

Создание проекта приложения

Создайте приложения LoginApp при помощи мастера проектов, а затем добавьте в его главное окно поля ввода идентификатора пользователя и пароля, элемент управления DadaGrid, а также кнопки Войти и Обновить.

Расположение этих элементов управления в окне приложения показано на рис. 9-32.

Соединение с базой данных

Затем откройте вкладку Data инструментальной панели Toolbox системы Microsoft Visual Studio.NET и перетащите из нее в окно приложения значок компонента SqlConnection, обеспечивающего соединение с базой данных. Настраивая свойство ConnectionString, созданного при этом объекта sqlConnection1, Вы можете создать новое соединение, как это было описано ранее в этой главе, или использовать соединение, созданное ранее для приложения SQLTestApp.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.