2010-11-23 2 views
1

Я публикую этот вопрос после прочтения других подобных вопросов о моей проблеме, но на самом деле не понимаю, как я могу использовать эту информацию.Использование SqlDataAdapter.Update и RowUpdating для обновления базы данных из gridview

Я в основном писал этот код, чтобы узнать, как я могу использовать SqlDataAdapters для обновления базы данных из GridView.

Я пишу мой GridView в моей странице ASPX следующим образом:

<asp:GridView ID="Clients" runat="server"> 
    <Columns> 
     <asp:TemplateField HeaderText="Name" SortExpression="Name"> 
      <ItemTemplate> 
       <asp:Label ID="labelName" runat="server" Text='<%# Eval("Name") %>'></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:TextBox ID="textboxName" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:CommandField EditText="Edit" ShowEditButton="true" /> 
    </Columns> 
</asp:GridView> 

Тогда в моем коде позади файла Я пишу следующий код (база данных это просто класс для подключения к базе данных ...) :

Database database = new Database(); 
database.open_connection(); 

SqlCommand command = new SqlCommand(query, database.dbConnection); 
SqlDataAdapter adapter = new SqlDataAdapter(command); 

DataTable dataTable = new DataTable(); 
adapter.Fill(dataTable); 

SqlCommandBuilder builder = new SqlCommandBuilder(adapter); 

Clients.AutoGenerateColumns = false; 
Clients.PageIndexChanging += new GridViewPageEventHandler(this.grid_view_page_index_changing); 
Clients.Sorting += new GridViewSortEventHandler(this.grid_view_sorting); 
Clients.RowEditing += new GridViewEditEventHandler(this.row_editing); 
Clients.RowUpdating += new GridViewUpdateEventHandler(this.row_updating); 
Clients.RowCancelingEdit += new GridViewCancelEditEventHandler(this.row_canceling_edit); 
Clients.AllowPaging = true; 
Clients.PageSize = 25; 
Clients.AllowSorting = true; 
Clients.DataSource = dataTable; 
Clients.DataBind(); 

database.close_connection(); 

Все это прекрасно работает до сих пор; Функции GridView Sorting, Editing, RowCancellingEdit, PageIndexChanging и т. Д. Работают так, как должны.

Моя проблема в том, что я вызываю функцию RowUpdating.

Что я хочу сделать, это использовать функцию adapter.Update() для обновления базы данных.

Он не вызывает ошибок в моем текущем коде, но он также не обновляет базу данных.

Как только я нажимаю кнопку «Обновить», текстовое поле редактирования из моего GridView исчезает, и перед тем, как его отредактировать, я остаюсь с исходным значением.

Это моя row_updating() функция:

public void row_updating(object sender, GridViewUpdateEventArgs e) { 
    GridViewRow gvr = gridView.Rows[Clients.EditIndex]; 

    TextBox txt = (TextBox)gvr.Cells[0].FindControl("textboxName"); 
    e.NewValues["Name"] = txt.Text; 

    adapter.Update((DataTable)Clients.DataSource); 

    Clients.EditIndex = -1; 
    Clients.DataBind(); 
} 

Я не могу понять, почему он не будет обновлять базу данных (возможно, потому что я делаю это совершенно неправильно)

Я видел вещи вокруг Интернет, который упоминает функцию EndEdit(), но я не уверен, что это применимо здесь.

Если кто-нибудь может сказать мне, что я делаю неправильно, и почему моя база данных не будет обновляться, это было бы очень признательно.

ответ

0

Я изменил свой row_updating() кода функции, которая не имеет большой relevence здесь, но дело в том, что установил ее для меня было убедившись, что я использовал! Page.IsPostBack

Так что теперь мои Page_Load() функций устанавливает GridView, а затем вместо того, чтобы просто связывание данных он идет:

if(!Page.IsPostBack) { 
    Clients.DataBind(); 
} 

Хотя он не работает отлично, по крайней мере, в настоящее время обновляет свою базу данных (что это дие Stion собирался, так что я буду размещать новые вопросы, если я не могу найти решение моей новой проблемы)

Иногда это просто самые простые вещи, которые вызывают самые досадные проблемы ...

0

Вы создали UpdateCommand для своего адаптера данных. Если нет, я думаю, вам может понадобиться сделать это, чтобы успешно обновить данные.

Также проверьте эту ссылку: MSDN

If INSERT, UPDATE или DELETE не были указаны заявления, метод Update генерирует исключение . Тем не менее, вы можете создать SqlCommandBuilder или OleDbCommandBuilder объект автоматически генерировать операторы SQL для обновления одной таблицы, если вы установите SelectCommand свойство поставщика данных .NET Framework . Затем любые дополнительные инструкции SQL, которые вы делаете не установлены, генерируются командованием CommandBuilder . Эта логика генерации требует, чтобы информация о ключевой колонке была , присутствующей в DataSet. Для получения дополнительной информации о см. Раздел «Генерация команд» с CommandBuilders (ADO.NET).

Метод Update извлекает строки из таблицы, перечисленные в первом сопоставлении перед выполнением обновления. Обновление затем обновляет строку, используя значение свойства UpdateRowSource . Любые дополнительные строки, возвращаемые , игнорируются.

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

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

The values in the DataRow are moved to the parameter values. 

The OnRowUpdating event is raised. 

The command executes. 

If the command is set to FirstReturnedRecord, then the first 

возвращенный результат помещается в DataRow.

If there are output parameters, they are placed in the DataRow. 

The OnRowUpdated event is raised. 

AcceptChanges is called. 
+0

Я попытался с помощью адаптера .UpdateCommand = builder.GetUpdateCommand(); как это было в ссылке, но я все равно получаю те же результаты. – 2010-11-23 10:55:50

Смежные вопросы