Доступ к базе данных из ASP.NET

ОГЛАВЛЕНИЕ

Доступ к базам данных из прикладных программ ASP.NET является одной из современных методик представления данных посетителям Web сайтов. ASP.NET делает это проще чем её предшественники, особенно при обращениях к базам данных, и обеспечивает поддержку управления данными в базе. В целях обеспечения высокой эффективности таких приложений, рекомендуется использование баз данных, поддерживающих SQL запросы и работающие с приложениями Web серверов. Поэтому, обращение к SQL базам данных будет первой нашей задачей. Общая процедура доступа к базам данных SQL из ASP.NET:

1. Установите подключение к базе данных, используя SQLConnection.
2. Соединитесь с базой данных, используя SQLDataSetCommand.
3. Заполните новый Dataset, использующий SQLDataSetCommand.FillDataSet.
4. Установите новый DataView для заданной таблицы.
5. Свяжите управление сервером, например: DataGrid с DataView.

Конечно, для осуществления такой процедуры необходимо учесть ещё много деталей, которые также должны быть выполнены. Далее, будут предложены Вашему вниманию примеры, показывающие, как эти детали используются в прикладных программах ASP.NET.
Микрософт .NET Framework имеет три средства управления, которые упрощают просмотр больших баз данных: Repeater, DataList и DataGrid. Хотя некоторые детали изменяются, по существу, та же самая процедура связывания используется для всех этих трёх средств управления, и она будет представлена ниже по тексту. Также, в этой статье будет обсуждаться управление связанными данными, с использованием средств управления DataGrid. Для получения дополнительной информации относительно этих средств управления, см. "Server-Side Data Access" и "Data Access and Customization" разделы документации "ASP.NET Quick Start", которая поставляется с Микрософт .NET Framework SDK


Связывание (Binding) SQL данных с Repeater Control

Repeater control полезен только для показа данных, не взаимодействуя с ними. Его преимущество состоит в том, что могут быть установлены шаблоны, позволяющие отображать данные различными способами.
Следующий пример демонстрирует связывание Repeater control с DataView (возвращённого из SQL запроса) который содержит информацию о размещении книг. В примере также присутствуют HeaderTemplate и FooterTemplate, которые включаются вначале и конце листинга, соответственно.
Repeater control выполняет только итерации по связанным данным, предоставляя itemtemplate один раз для каждого элемента в коллекции DataSource. Он не предоставляет ничего, кроме элементов, содержащихся в его шаблонах.

Доступ к SQL базе данных

1. Импортируйте необходимые для вашей страницы пространства имён. Это позволит обеспечить ваш код доступом к необходимым классам.

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>
<html>

2. В пределах тэга <script language="C#" runat="server">, используйте функцию Page_Load, которая обеспечит подключение к базе данных, создаст и заполнит новый Dataset информацией из базы и затем свяжет Repeater control с Dataset. Это показывается в следующем примере кода:

<script language="C#" runat="server">
void Page_Load(Object semder, EventArgs e) {
{

а) Обеспечьте подключение к базе данных "pubs", расположенной на локальном компьютере.

        SQLConnection myConnection = new SQLConnection( 
"server=localhost;uid=sa;pwd=;database=pubs");

б) Соединитесь с SQL базой данных, используя запрос "select *", чтобы получить все данные из таблицы "Titles".

        SQLDataSetCommand myCommand = new SQLDataSetCommand(
"select * from Titles", myConnection);

в) Создайте и заполните Dataset.

        DataSet ds = new DataSet();
myCommand.FillDataSet(ds, "Titles");

г) Свяжите MyDataList с таблицей "Titles", используя заданное по умолчанию представление. Заметьте, что MyDataList - это "id" установленный для Repeater control в <body> страницы.

        MyDataList.DataSource = ds.Tables["Titles"].DefaultView;
MyDataList.DataBind();
}

</script>

3. В тэге страницы <body>, отобразите данные.


<body topmargin="0" leftmargin="0" marginwidth="0" marginheight="0">

4. Откройте Repeater control

    <ASP:Repeater id="MyDataList" runat="server">

5. Установите шаблоны для Repeater control.

а) Установите шаблон для открытия таблицы и отображения заголовков столбцов.

      <template name="headertemplate">
<table width="100%" style="font: 8pt verdana">
<tr style="background-color:DFA894">
<th>
Заголовок
</th>
<th>
ID заголовока
</th>
<th>
Тип
</th>
<th>
ID издателя
</th>
<th>
Цена
</th>
</tr>
</template>

б) Установите шаблон отображающий реальные данные.

      <template name="itemtemplate">
<tr style="background-color:FFECD8">
<td>
<%# DataBinder.Eval(Container.DataItem, "title") %>
</td>
<td>
<%# DataBinder.Eval(Container.DataItem, "title_id") %>
</td>
<td>
<%# DataBinder.Eval(Container.DataItem, "type") %>
</td>
<td>
<%# DataBinder.Eval(Container.DataItem, "pub_id") %>
</td>
<td>
<%# DataBinder.Eval(Container.DataItem, "price", "$ {0}") %>
</td>
</tr>
</template>

в) Установите шаблон для закрытия таблицы.

      <template name="footertemplate">
</table>
</template>

6. Закройте Repeater control

  </ASP:Repeater>

7. Закройте страницу.

</body>
</html>


 

Связывание SQL данных с DataList Control

В то время как Repeater является итератором общего назначения, DataList обеспечивает некоторые дополнительные возможности управления размещением в листинге. В отличие от Repeater, DataList позволяет включить дополнительные элементы вне определения шаблона, подобно строкам, ячейкам и промежуткам таблицы, которые содержат атрибуты стиля. Это предоставляет более широкие возможности форматирования. Например, DataList поддерживает свойства RepeatColumns и RepeatDirection, которые определяют, должны ли данные быть представлены в нескольких столбцах и в каком направлении (вертикально или горизонтально) чтобы представить элементы данных. DataList также поддерживает атрибуты стиля: тип, размер и имя шрифта.
Этот пример показывает, как обратиться к SQL базе данных, которая содержит заголовки книг и немного ключевой информации о каждой книге, и затем отображает данные, используя DataList. Результат имеет всю заданную информацию для каждой книги, сгруппированную вместе, и информация для каждой книги представлена в двух столбцах в порядке слева направо.

Доступ к SQL базе данных

1. Импортируйте необходимые для вашей страницы пространства имён. Это позволит обеспечить ваш код доступом к необходимым классам.

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>
<html>

2. В пределах тэга <script language="C#" runat="server">, включите функцию Page_Load, которая обеспечит подключение к базе данных, создаст и заполнит новый Dataset информацией из базы данных, и затем свяжет Repeater control с Dataset. Это показано в следующем примере кода:

<script language="C#" runat="server">
void Page_Load(Object sender, EventArgs e) {

а) Установите подключение к базе данных "pubs", расположенной на локальном компьютере.

        SQLConnection myConnection = new SQLConnection 
("server=localhost; uid=sa;pwd=;database=pubs");

б) Соединитесь с SQL базой данных, используя запрос "SELECT *", чтобы получить все данные из таблицы "Titles".

        SQLDataSetCommand myCommand = new SQLDataSetCommand
("select * from Titles", myConnection);

в) Создайте и заполните Dataset.

        DataSet ds = new DataSet();
myCommand.FillDataSet(ds, "Titles");

г) Свяжите MyDataList с таблицей "Titles", используя заданное по умолчанию представление. Заметьте, что MyDataList - это "ID" установленный для DataList в <body> страницы.

        MyDataList.DataSource = ds.Tables["Titles"].DefaultView;
MyDataList.DataBind();
}

3. В тэге страницы <body>, отобразите данные.

</script>
<body topmargin="0" leftmargin="0" marginwidth="0" marginheight="0">

4. Откройте DataList, устанавливая его для двух столбцов, которые будут заполнен в горизонтальном порядке.

  <ASP:DataList id="MyDataList" RepeatColumns="2" RepeatDirection= 
"Horizontal" runat="server">

5. Установите шаблон DataList с именем "itemtemplate".

      <template name="itemtemplate">

а) Используйте элемент <div>, что бы обрабатывать данные для каждой книги как логический модуль.

        <div style="padding:15,15,15,15;font-size:10pt;
font-family:Verdana">

б) Используйте вложенный элемент <div> для связи данных заголовка и показа их различными шрифтами.

          <div style="font:12pt verdana;color:darkred">
<i><b><%# DataBinder.Eval(Container.DataItem, "title")%>
</i></b>
</div>
<br>

в) Связываем и показываем остальную часть данных в шрифте, установленном элементом <div>.

          <b>Title ID: </b><%# DataBinder.Eval(Container.DataItem,
"title_id") %><br>
<b>Category: </b><%# DataBinder.Eval(Container.DataItem,
"type")%><br>
<b>Publisher ID: </b><%# DataBinder.Eval
(Container.DataItem, "pub_id") %><br>
<b>Price: </b><%# DataBinder.Eval
(Container.DataItem, "price", "$ {0}") %><p>
</div>
</template>
</ASP:DataList>

</body>
</html>


Связывание SQL данных с DataGrid Control

DataGrid Control наиболее универсальное из имеющихся трех средств управления сервера. Он отображает данные таблиц в произвольном наборе, сортировке, выборке и порядке редактирования данных. По умолчанию, DataGrid генерирует связанный столбец для каждого поля в источнике данных (AutoGenerateColumns = true). Каждое поле данных будет предоставлено в отдельном столбце, в таком порядке, как они располагаются непосредственно в данных. Имена полей располагаются в заголовках столбцов, а их значения предоставлены в виде текста. Заданный по умолчанию формат применяется для не строковых значений.

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

Доступ к SQL базе данных

1. Импортируйте необходимые пространства имён для вашей страницы. Это обеспечит ваш код доступом к необходимым классам.

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>
<html></p></pre></tt>

2. В пределах тэга <script language="C#" runat="server">, включите функцию Page_Load, которая обеспечит подключение к базе данных, создаст и заполнит новый Dataset информацией из базы данных, и затем свяжет DataGrid с Dataset. Это показано в следующем примере кода:

<script language="C#" runat="server">
public DataView Source;
protected void Page_Load(Object Src, EventArgs E )
{

а) Установите подключение к базе данных "pubs", расположенной на локальном компьютере.

        SQLConnection myConnection = new SQLConnection("
server=localhost;uid=sa;pwd=;database=pubs");

б) Соединитесь с SQL базой данных, используя запрос "SELECT *", чтобы получить все данные из таблицы "Authors".

        SQLDataSetCommand myCommand = new SQLDataSetCommand("select 
* from Authors", myConnection);

в) Создайте и заполните Dataset.

        DataSet ds = new DataSet();
myCommand.FillDataSet(ds, "Authors");

г) Установите DataView, и свяжите с ним MyDataGrid. Заметьте, что MyDataGrid - это "ID" установленный для DataGrid в <body> страницы.

        Source = new DataView(ds.Tables[0]);
MyDataGrid.DataSource=Source ;
MyDataGrid.DataBind();
}
</script>

3. В тэге страницы <body>, отобразите DataGrid.

<body>

а) Покажите заголовок страницы.

  <h3><font face="Verdana">Simple Select to a DataGrid 
Control</font></h3>

б) Отобразите данные.

  <ASP:DataGrid id="MyDataGrid" runat="server"
Width="700"
BackColor="#ccccff"
BorderColor="black"
ShowFooter="false"
CellPadding=3
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
MaintainState="false"
/>
</body>
</html>


Вставка данных в SQL базу данных

После подключения и связывания с данными в базе, может возникнуть необходимость добавления строк данных в базу. Этот раздел рассказывает, как добавить новые строки данных, используя DataGrid и специальную форму для ввода.

Добавление новых строк в базу данных

1. Импортируйте необходимые пространства имён.

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>
<%@ Import Namespace="System.Text"%>
<html>

В теле тэга <script language="C#" runat="server">, этот пример реализует три функции: Page_Load, AddAuthor_Click, и BindGrid. Эти функции более подробно описаны в представленных ниже шагах.

<script language="C#" runat="server">
SQLConnection myConnection;

2. Определите функцию Page_Load, которая устанавливает необходимую для подключения к базе данных "pubs" информацию. Она также проверяет, является ли эта страница PostBack и, если нет, вызывает функцию BindGrid. Описание BindGrid представлено в шаге 4.

    protected void Page_Load(Object Src, EventArgs E ) 
{
myConnection = new SQLConnection
("server=localhost;uid=sa;pwd=;database=pubs");
if (!IsPostBack)
BindGrid();

}

3. Определите функцию AddAuthor_Click. Эта функция делает некоторые проверки правильности введённых в форме данных, и затем строит строку, содержащую все поля входной формы. После этого, она добавляет эту строку в базу данных и контролирует (используя пробные команды), что данные были добавлены. Наконец, она снова перестраивает DataGrid, чтобы показать новые данные.


public void AddAuthor_Click(Object sender, EventArgs E)
{

а) Проверка того, что эти четыре входных значения не пустые. Если любое из них является пустым, выводится соответствующее сообщение пользователю и снова перестраивается DataGrid.

        if (au_id.Value == "" || au_fname.Value == "" || 
au_lname.Value == "" || phone.Value == "")
{
Message.InnerHtml = "ОШИБКА: Пустое значение не допустимо для полей
Author ID, Name или Phone";
Message.Style["color"] = "red";
BindGrid();
return;
}

б) Строим разграниченную запятыми строку всех входных значений полей формы. Создаются новые параметры для объекта SQLCommand и, при их инициализации входными значениями полей формы, выдаётся команда на исполнение. SQLCommand также инициализируется новой строкой и информацией для подключения.

        String insertCmd = "insert into Authors values 
(@Id, @LName, @FName, @Phone, @Address, @City,
@State, @Zip, @Contract)";
SQLCommand myCommand = new SQLCommand(insertCmd,
myConnection);
myCommand.Parameters.Add(new SQLParameter("@Id",
SQLDataType.VarChar, 11));
myCommand.Parameters["@Id"].Value = au_id.Value;
myCommand.Parameters.Add(new SQLParameter("@LName",
SQLDataType.VarChar, 40));
myCommand.Parameters["@LName"].Value = au_lname.Value;
myCommand.Parameters.Add(new SQLParameter("@FName",
SQLDataType.VarChar, 20));
myCommand.Parameters["@FName"].Value = au_fname.Value;
myCommand.Parameters.Add(new SQLParameter("@Phone",
SQLDataType.Char, 12));
myCommand.Parameters["@Phone"].Value = phone.Value;
myCommand.Parameters.Add(new SQLParameter("@Address",
SQLDataType.VarChar, 40));
myCommand.Parameters["@Address"].Value = address.Value;
myCommand.Parameters.Add(new SQLParameter("@City",
SQLDataType.VarChar, 20));
myCommand.Parameters["@City"].Value = city.Value;
myCommand.Parameters.Add(new SQLParameter("@State",
SQLDataType.Char, 2));
myCommand.Parameters["@State"].Value = state.Value;
myCommand.Parameters.Add(new SQLParameter("@Zip",
SQLDataType.Char, 5));
myCommand.Parameters["@Zip"].Value = zip.Value;
myCommand.Parameters.Add(new SQLParameter("@Contract",
SQLDataType.VarChar,1));
myCommand.Parameters["@Contract"].Value = contract.Value;

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

        SQLConnection myConnection = new SQLConnection 
("server=localhost;uid=sa;pwd=;database=pubs");
SQLCommand myCommand = new SQLCommand(insertCmd.ToString(),
myConnection);

г) Соединение с базой данных. Обновление базы данных с новой строкой.

        myCommand.ActiveConnection.Open();

д) Проверка того, что новая строка была добавлена и возврат соответствующего окна сообщения пользователю.

        try 
{
int rowsAffected = 0;
myCommand.Execute(ref rowsAffected);
Message.InnerHtml = "<b>Record Added</b><br>" +
insertCmd.ToString();
}
catch (SQLException e)
{
if (e.Number == 2627)
Message.InnerHtml = "ОШИБКА: Запись с таким первичным
ключом уже существует ";
else
Message.InnerHtml = "ОШИБКА: Невозможно добавить запись,
пожалуйста, убедитесь, что поля правильно заполнены";
Message.Style["color"] = "red";
}

е) Закрытие активного подключения к базе данных.

        myCommand.ActiveConnection.Close();

ж) Пересоздание DataGrid, содержащего новую строку.

        BindGrid();
}

4. Определение функции BindGrid. Эта функция подключается к базе данных и реализует стандартный SQL запрос "SELECT *", чтобы получить все данные из таблицы базы "Authors".

public void BindGrid() 
{

а) Устанавливаем подключение к базе данных "pubs", расположенной на локальном компьютере.

        SQLConnection myConnection = new SQLConnection 
("server=localhost;uid=sa;pwd=;database=pubs");

б) Соединяемся с базой данных и исполняем запрос "SELECT *" для таблицы "Authors".

        SQLDataSetCommand myCommand = new SQLDataSetCommand("select 
* from Authors", myConnection);

в) Создаём и заполняем новый Dataset.

        DataSet ds = new DataSet();
myCommand.FillDataSet(ds, "Authors");

г) Связываем MyDataGrid с таблицей "Authors" в Dataset.

        MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView;
MyDataGrid.DataBind();
}
</script>

5. В тэге страницы <body>, отображаем DataGrid, и создаём отображение входной формы.

<body style="font: 10pt verdana">

а) Открываем форму.

  <form runat="server">
<h3><font face="Verdana">Inserting a Row of Data</font></h3>

б) Создаём таблицу.

    <table width="95%">
<tr>
<td valign="top">

в) Помещаем DataGrid в первый столбец таблицы.

          <ASP:DataGrid id="MyDataGrid" runat="server"
Width="700"
BackColor="#ccccff"
BorderColor="black"
ShowFooter="false"
CellPadding=3
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
MaintainState="false"
/>

г) Создаём второй столбец таблицы.

        </td>
<td valign="top">

д) Помещаем входную форму (вторая таблица) во втором столбце.

          <table style="font: 8pt verdana">
<tr>
<td colspan="2" bgcolor="#aaaadd" style="font:10pt
verdana">Add a New Author:</td>
</tr>
<tr>
<td nowrap>Author ID: </td>
<td><input type="text" id="au_id" value="000-00-0000"
runat="server"></td>
</tr>
<tr>
<td nowrap>Last Name: </td>
<td><input type="text" id="au_lname" value="Doe"
runat="server"></td>
</tr>
<tr nowrap>
<td>First Name: </td>
<td><input type="text" id="au_fname" value="John"
runat="server"></td>
</tr>
<tr>
<td>Phone: </td>
<td><input type="text" id="phone" value="808 555-5555"
runat="server"></td>
</tr>
<tr>
<td>Address: </td>
<td><input type="text" id="address" value="One
Microsoft Way" runat="server"></td>
</tr>
<tr>
<td>City: <td>
<td><input type="text" id="city" value="Redmond"
runat="server"></td>
</tr>
<tr>
<td>State: </td>
<td>
<select id="state" runat="server">
<option>CA</option>
<option>IN</option>
<option>KS</option>
<option>MD</option>
<option>MI</option>
<option>OR</option>
<option>TN</option>
<option>UT</option>
</select>
</td>
</tr>
<tr>
<td nowrap>Zip Code: </td>
<td><input type="text" id="zip" value="98005"
runat="server"></td>
</tr>
<tr>
<td>Contract:</td>
<td>
<select id="contract" runat="server">
<option value="0">False</option>
<option value="1">True</option>
</select>
</td>
</tr>
<tr>
<td></td>
<td style="padding-top:15">
<input type="submit" OnServerClick="AddAuthor_Click"
value="Add Author" runat="server">
</td>
</tr>
<tr>
<td colspan="2" style="padding-top:15" align="center">
<span id="Message" MaintainState="false"
style="font: arial 11pt;" runat="server"/>
</td>
</tr>
</table>

</td>
</tr>
</table>

</form>

</body>
</html>


Обновление данных в базе

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

Он имеет кнопочку "edit", которая, когда её нажимаешь, делает все поля в текущей строке текстовыми, показывая в них имеющиеся данные. После этого, поля могут быть отредактированы, что предоставляет пользователю возможность внесения в них новой информации. Когда новая информация внесена, пользователь может нажать кнопочку "update", после чего данные будут изменены непосредственно в базе данных.

Модификация существующих данных

1. Импортируем необходимые пространства имён.

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>
<%@ Import Namespace="System.Text"%>
<html>

В рамках тэга <script language="C#" runat="server">реализуются пять примеров функций: Page_Load, MyDataGridEdit, MyDataGridCancel, MyDataGridUpdate и BindGrid. Эти функции описаны более подробно в представленных ниже шагах.

<script language="C#" runat="server">
SQLConnection myConnection;

2. Определяем функцию Page_Load, которая устанавливает информацию о подключении к базе данных "pubs". Также она проверяет, что эта страница не является PostBack, но если это так, вызывает специальную функцию BindGrid. BindGrid описана в шаге 4, главы 5. "Вставка данных в SQL базу данных".

3. Определяем функцию MyDataGrid_Edit. Эта функция устанавливает индекс для строки в DataGrid, который был запрошен, и затем вызывает BindGrid.

public void MyDataGrid_Edit(Object sender, DataGridCommandEventArgs E)
{
MyDataGrid.EditItemIndex = (int)E.Item.ItemIndex;
BindGrid();
}

4. Определяем функцию MyDataGrid_Cancel. Эта функция сбрасывает индекс к предыдущим параметрам настройки строки, и затем вызывает BindGrid.

public void MyDataGrid_Cancel(Object sender, DataGridCommandEventArgs E)

{
MyDataGrid.EditItemIndex = -1;
BindGrid();
}

5. Определяем функцию MyDataGrid_Update. Когда нажата кнопка "update", эта функция строит разграниченную запятыми командную строку SQL UPDATE и пары fieldname/value (fieldname=value,). Выполняется соединение с базой данных, обновляется информация полей строки в базе данных, и затем снова пересоздаётся DataGrid, что позволяет увидеть модифицированную информацию.

public void MyDataGrid_Update(Object sender, 
DataGridCommandEventArgs E)
{

а) Устанавливаем параметры использования SQLCommand и информацию подключения, которая была определена в шаге 2.

        String updateCmd = "UPDATE Authors SET au_id = @Id, 
au_lname = @LName, au_fname = @FName,
phone = @Phone, address = @Address,
city = @City, state = @State, zip = @Zip,
contract = @Contract where au_id = @Id";
SQLCommand myCommand = new SQLCommand(updateCmd, myConnection);
myCommand.Parameters.Add(new SQLParameter("@Id",
SQLDataType.VarChar));
myCommand.Parameters.Add(new SQLParameter("@LName",
SQLDataType.VarChar));
myCommand.Parameters.Add(new SQLParameter("@FName",
SQLDataType.VarChar));
myCommand.Parameters.Add(new SQLParameter("@Phone",
SQLDataType.Char));
myCommand.Parameters.Add(new SQLParameter("@Address",
SQLDataType.VarChar));
myCommand.Parameters.Add(new SQLParameter("@City",
SQLDataType.VarChar));
myCommand.Parameters.Add(new SQLParameter("@State",
SQLDataType.VarChar));
myCommand.Parameters.Add(new SQLParameter("@Zip",
SQLDataType.VarChar));
myCommand.Parameters.Add(new SQLParameter("@Contract",
SQLDataType.VarChar));
String[] cols = {"@Id", "@LName", "@FName", "@Phone",
"@Address", "@City","@State","@Zip","@Contract"};

б) Для SQLCommand инициализируем параметр "@id", для строки с таким id, который определяет выбранную для обновления строку.

        myCommand.Parameters["@Id"].Value = 
MyDataGrid.DataKeys[(int)E.Item.ItemIndex];

в) Создаём массив имён столбцов.

        String[] cols = {"@Id","@LName","@FName","@Phone",
"@Address", "@City","@State","@Zip","@Contract"};

г) Пропуская первые, вторые и последние столбцы, выполняем итерации по столбцам, проверяя их пустые значений. Если пустое значение найдено, выдаём пользователю соответствующее окно сообщения. Также, инициализируем значения параметров SQLCommand.

        int numCols = E.Item.Cells.Count;
for (int i=2; i<numCols-1; i++)
{
String colvalue =
((TextBox)E.Item.Cells[i].Controls[0]).Text;
if (i<6 && colvalue == "")
{
Message.InnerHtml = "ОШИБКА: Пустое значение не допустимо
для полей Author ID, Name или Phone";
Message.Style["color"] = "red";
return;
}
myCommand.Parameters[cols[i-1]].Value = colvalue;
}

д) Добавляем в конец последнее поле, конвертируя значения true/false в 0/1.

        if (String.Compare(((TextBox)E.Item.Cells
[numCols-1].Controls[0]).Text, "true", true)==0)
myCommand.Parameters["@Contract"].Value = "1";
else
myCommand.Parameters["@Contract"].Value = "0";

е) Соединяемся с базой данных, и обновляем информацию.

        myCommand.ActiveConnection.Open();

ж) Проверяем, что данные были успешно модифицированы и возвращаем пользователю соответствующее сообщение.

        try 
{
myCommand.Execute(ref rowsAffected);
Message.InnerHtml = "<b>Record Updated</b><br>" +
updateCmd.ToString();
MyDataGrid.EditItemIndex = -1;
}
catch (SQLException e)
{
if (e.Number == 2627)
Message.InnerHtml = "ОШИБКА: Запись с таким первичным
ключом уже существует ";
else
Message.InnerHtml = "ОШИБКА: Невозможно добавить запись,
пожалуйста, убедитесь, что поля правильно заполнены";
Message.Style["color"] = "red";
}

з) Закрываем подключение.

        myCommand.ActiveConnection.Close();

и) Снова пересоздаём DataGrid, чтобы отобразить модифицированную информацию.

        BindGrid();
}

6. Определение функции BindGrid. Эта функция подключается к базе данных и реализует стандартный SQL запрос "SELECT *", чтобы получить все данные из таблицы базы "Authors". BindGrid описана в шаге 4, главы 5. "Вставка данных в SQL базу данных".

7. Внутри <body>, отображаем данные.

<body style="font: 10pt verdana">
<form runat="server">
<h3><font face="Verdana">Updating a Row of Data</font></h3>
<span id="Message" MaintainState="false" style="font: arial 11pt;"
runat="server"/><p>
<ASP:DataGrid id="MyDataGrid" runat="server"
Width="800"
BackColor="#ccccff"
BorderColor="black"
ShowFooter="false"
CellPadding=3
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
OnEditCommand="MyDataGrid_Edit"
OnCancelCommand="MyDataGrid_Cancel"
OnUpdateCommand="MyDataGrid_Update"
DataKeyField="au_id"
>
<property name="Columns">
<asp:EditCommandColumn EditText="Edit" CancelText="Cancel"
UpdateText="Update" ItemStyle-Wrap="false"/>
</property>
</ASP:DataGrid>
</form>
</body>
</html>


Удаление данных из базы

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

Удаление строки из базы данных

1. Импортируем необходимые пространства имён.

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>
<html>

В тэге <script language="C#" runat="server">, представлен пример трёх функций: Page_Load, MyDataGrid_Delete и BindGrid. Более подробно эти функции описаны в представленных ниже шагах.

<script language="C#" runat="server">
SQLConnection myConnection;

2. Определяем функцию Page_Load, которая устанавливает информацию о подключении к базе данных "pubs". Также она проверяет, что эта страница не является PostBack, но если это так, вызывает специальную функцию BindGrid. BindGrid описана в шаге 4, главы 5. "Вставка данных в SQL базу данных".

3. Определяем функцию MyDataGrid_Delete. Эта функция выполняет SQL инструкцию DELETE, соединяется с базой данных, удаляет указанную строку и затем снова пересоздаёт DataGrid, чтобы отобразить пользователю модификации в базе данных.

public void MyDataGrid_Delete(Object sender, 
DataGridCommandEventArgs E)
{

а) Устанавливаем информацию для SQLCommand.

        String deleteCmd = "DELETE from Authors where au_id = @Id";
SQLCommand myCommand = new SQLCommand(deleteCmd,
myConnection);
myCommand.Parameters.Add(new SQLParameter("@Id",
SQLDataType.VarChar, 11));

б) Для SQLCommand инициализируем параметр "@id", для строки с таким id, который определяет выбранную для обновления строку.

        myCommand.Parameters["@Id"].Value = 
MyDataGrid.DataKeys[(int)E.Item.ItemIndex];

в) Соединяемся с базой данных, и удаляем указанную строку.

        myCommand.ActiveConnection.Open();

г) Проверяем, что данные были успешно удалены и возвращаем пользователю соответствующее сообщение.

        try 
{
int rowsAffected = 0;
myCommand.Execute(ref rowsAffected);
Message.InnerHtml = "<b>Запись удалена</b><br>" +
deleteCmd;
}
catch (SQLException)
{
Message.InnerHtml = "ОШИБКА: Не могу удалить запись";
Message.Style["color"] = "red";
}

д) Закрываем подключение.

        myCommand.ActiveConnection.Close();

е) Снова пересоздаём DataGrid, чтобы показать изменённую информацию.

        BindGrid();
}

4. Определение функции BindGrid. Эта функция подключается к базе данных и реализует стандартный SQL запрос "SELECT *", чтобы получить все данные из таблицы базы "Authors". BindGrid описана в шаге 4, главы 5. "Вставка данных в SQL базу данных".

5. Внутри <body> отображаем данные.

<body style="font: 10pt verdana">
<form runat="server">
<h3><font face="Verdana">Deleting a Row of Data</font></h3>
<span id="Message" MaintainState="false" style="font: arial 11pt;"
runat="server"/><p>
<ASP:DataGrid id="MyDataGrid" runat="server"
Width="800"
BackColor="#ccccff"
BorderColor="black"
ShowFooter="false"
CellPadding=3
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
DataKeyField="au_id"
OnDeleteCommand="MyDataGrid_Delete"
>
<property name="Columns">
<asp:ButtonColumn Text="Delete Author" Command="Delete"/>
</property>
</ASP:DataGrid>
</form>
</body>


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

Этот пример обеспечивает доступ к базе данных, связывает DataGrid с именами столбцов, которые являются сортируемыми. Когда имя столбца выбрано, таблица будет отсортирована непосредственно в порядке этого столбца.

Создание отсортированной таблицы

1. Импортируем необходимые пространства имён.

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>
<html>

Внутри тэга <script language="C#" runat="server"> показан пример трёх функций: Page_Load, MyDataGrid_Sort и BindGrid. Эти функции более подробно описаны в представленных ниже шагах.

<script language="C#" runat="server">
SQLConnection myConnection;

2. Определяем функцию Page_Load, которая устанавливает информацию подключения к базе данных "pubs". Также она проверяет, что эта страница не является PostBack, но если это так, вызывает специальную функцию BindGrid. BindGrid описана в шаге 4, главы 5. "Вставка данных в SQL базу данных".

3. Определяем функцию MyDataGrid_Sort. Эта функция получает аргумент DataGridSortCommandEventArgs E, который связан с атрибутом OnSortCommand в DataGrid, и использует его в BindGrid.

protected void MyDataGrid_Sort(Object Src, 

DataGridSortCommandEventArgs E)
{
BindGrid(E.SortField);
}

4. Определяем функцию BindGrid. Эта функция исполняется по-другому, чем в предыдущих примерах. Параметр SortField (сортируемый столбец) передаётся в неё из функции MyDataGrid_Sort. Она использует эту информацию, чтобы отсортировать таблицу по указанному столбцу.

public void BindGrid(String SortField) 
{

а) Устанавливаем SQLDataSetCommand, чтобы получить доступ к таблице "Authors" в базе данных "pubs" (myConnection было установлено в шаге 2).

        SQLDataSetCommand myCommand = new SQLDataSetCommand
("select * from Authors", myConnection);

б) Устанавливаем и заполняем новый Dataset.

        DataSet ds = new DataSet();
myCommand.FillDataSet(ds, "Authors");

в) Устанавливаем DataView для нового Dataset, и сортируем данные, используя SortField.

        DataView Source = ds.Tables["Authors"].DefaultView;
Source.Sort = sortfield;

г) Связываем DataGrid с сортируемым DataView. Заметьте, что MyDataGrid - это "id", переданный DataGrid в body страницы (шаг 5б).

        MyDataGrid.DataSource=Source;
MyDataGrid.DataBind();
}

5. В <body> отображаем данные.

<body>

а) Отображаем заголовок.

  <h3><font face="Verdana">Sorting Data in a DataGrid Control
</font></h3>

б) В тэге <form> создаём DataGrid и инициализируем его атрибуты.

  <form runat="server">
<ASP:DataGrid id="MyDataGrid" runat="server"
OnSortCommand="MyDataGrid_Sort"
Width="700"
BackColor="#ccccff"
BorderColor="black"
ShowFooter="false"
CellPadding=3
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
AllowSorting="true"
/>
</form>
</body>
</html>