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