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

ОГЛАВЛЕНИЕ

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

Часто нужно модифицировать поля в существующей базе данных. Этот раздел показывает, как это следует делать. В этом примере, на показываемой странице, слева от отображаемого 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>