Доступ к данным | Доступ к БД из ASP.NET | 6. Обновление данных в базе Дальше »

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

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

Доступ к данным | Доступ к БД из ASP.NET | 6. Обновление данных в базе Дальше »
Скачать электронную карту Ангарска бесплатно
Сайт управляется системой uCoz