2016-10-20 2 views
1

Я пытаюсь обновить данные в виде сетки с помощью хранимой процедуры, но я получаю сообщение об ошибке:Как обновить данные в gridview с помощью хранимой процедуры?

No mapping exists from object type System.Web.UI.WebControls.TextBox to a known managed provider native type.

Хранимая процедура:

CREATE PROCEDURE [dbo].[UpdateUser] 
    @id int, 
    @FirstName nvarchar(100) 
AS 
BEGIN 
    UPDATE tblUsers 
    SET FirstName = @FirstName 
    WHERE id = @id 
END 
GO 

Код

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    int id = Convert.ToInt16(GridView1.DataKeys[e.RowIndex].Value); 
    TextBox FirstName = (TextBox)GridView1.Rows[e.RowIndex].FindControl("TextBox1"); 

    cmd = new SqlCommand("UpdateUser", con); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.AddWithValue("@id", id); 
    cmd.Parameters.AddWithValue("@FirstName", FirstName); 

    con.Open(); 
    cmd.ExecuteNonQuery(); 

    bindData(); 
    con.Close(); 
} 

Можете ли вы предложить мне как решить эту ошибку?

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    CellPadding="4" DataKeyNames="id" ForeColor="#333333" GridLines="None" 
    OnRowCancelingEdit="GridView1_RowCancelingEdit" 
    OnRowDeleting="GridView1_RowDeleting" OnRowEditing="GridView1_RowEditing" 
    OnRowUpdating="GridView1_RowUpdating"> 
    <AlternatingRowStyle BackColor="White" /> 
    <Columns> 
     <asp:TemplateField HeaderText="ID"> 
      <ItemTemplate> 
       <asp:Label ID="id" runat="server" Text='<%# Eval("id") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="First Name"> 
      <EditItemTemplate> 
       <asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("FirstName") %>'></asp:TextBox> 
      </EditItemTemplate> 
      <ItemTemplate> 
       <asp:Label ID="lblFname" runat="server" Text='<%# Eval ("FirstName") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Last Name"> 
      <ItemTemplate> 
       <asp:Label ID="lblLname" runat="server" Text='<%# Eval("LastName") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Address"> 
      <ItemTemplate> 
       <asp:Label ID="lblAddress" runat="server" Text='<%#Eval("address") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Email"> 
      <ItemTemplate> 
       <asp:Label ID="lblEmail" runat="server" Text='<%# Eval("Email") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Phone"> 
      <ItemTemplate> 
       <asp:Label ID="lblPhone" runat="server" Text='<%# Eval("Phone") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:CommandField ShowEditButton="True" /> 
     <asp:CommandField ShowDeleteButton="True" /> 
    </Columns> 
    <EditRowStyle BackColor="#7C6F57" /> 
    <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" /> 
    <HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" /> 
    <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" /> 
    <RowStyle BackColor="#E3EAEB" /> 
    <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" /> 
    <SortedAscendingCellStyle BackColor="#F8FAFA" /> 
    <SortedAscendingHeaderStyle BackColor="#246B61" /> 
    <SortedDescendingCellStyle BackColor="#D4DFE1" /> 
    <SortedDescendingHeaderStyle BackColor="#15524A" /> 
</asp:GridView> 
+1

Попробуйте 'ЦМД. Parameters.AddWithValue ("@ FirstName", FirstName.Text); '. Вы пытаетесь отправить Control вместо его содержимого. – VDWWD

+0

пока не появится та же ошибка –

+0

Тогда вы делаете то же самое в другом месте. Если вы попробуете свой код без '.Text', я получаю ту же ошибку, с которой ваш фрагмент отлично работает. Вы перестроили свой проект? – VDWWD

ответ

0

Вы передаете переменную TextBox на ваш запрос. Если вы сделаете это, он должен работать:

cmd.Parameters.AddWithValue("@FirstName", FirstName.Text); 
+0

пока не появится та же ошибка –

0

Проблема заключается в том, что вы передаете объект TextBox методу AddWithValue. Поскольку он распознает только родные типы, он дает ошибку, которую вы видите.

Вы должны передать значение Textbox.Text, а не сам объект.

Измените код, чтобы быть как это:

cmd.Parameters.AddWithValue("@FirstName", FirstName.Text); 

EDIT 1:

Попробуйте изменить это:

TextBox FirstName = (TextBox)GridView1.Rows[e.RowIndex].FindControl("TextBox1"); 

Для этого:

TextBox FirstName = (TextBox)GridView1.Rows[GridView1.EditIndex].FindControl("TextBox1"); 
+0

пока не появится та же ошибка –

+0

@LoveAajkal Можете ли вы поделиться кодом для GridView, пожалуйста? –

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