2

私は新しい ASP.NET 開発者で、GridView コントロールを使用してデータベースの従業員テーブルにすべての従業員を表示しようとしています。現在、GridView の情報を更新できるように取り組んでいます。次の問題に直面していますが、その理由がわかりません。

**

UpdateCommand が指定されていない限り、更新はデータ ソース 'SqlDataSource1' でサポートされていません。

**

参考までに、次のデータベース設計があります。

Employee Table: Username, Name, JobTitle, BadgeNo, IsActive, DivisionCode
Divisions Table: SapCode, DivisionShortcut

(IsActive は、従業員が割り当てられているかどうかを示すフラグ (ビット データ型) のようなものです)

ASP.NET コード:

<asp:GridView ID="GridView1" runat="server" AllowSorting="True" 
            AutoGenerateColumns="False" DataKeyNames="Username" 
            DataSourceID="SqlDataSource1" BorderWidth="1px" BackColor="#DEBA84" 
             CellPadding="3" CellSpacing="2" BorderStyle="None" 
             BorderColor="#DEBA84" OnRowEditing="GridView1_RowEditing" 
             OnRowCancelingEdit="GridView1_RowCancelingEdit" 
             OnRowUpdating="GridView1_RowUpdating">
            <FooterStyle ForeColor="#8C4510" 
              BackColor="#F7DFB5"></FooterStyle>
            <PagerStyle ForeColor="#8C4510" 
              HorizontalAlign="Center"></PagerStyle>
            <HeaderStyle ForeColor="White" Font-Bold="True" 
              BackColor="#A55129"></HeaderStyle>
            <Columns>
                <asp:CommandField ButtonType="Button" ShowEditButton="true" ShowCancelButton="true" />

                <asp:TemplateField>
                    <ItemTemplate>
                        <%# Eval("DivisionShortcut")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="DivisionsList" runat="server" DataSourceID="DivisionsListDataSource"
                                            DataTextField="DivisionShortcut" DataValueField="SapCode"></asp:DropDownList>
                    </EditItemTemplate>
                </asp:TemplateField>

                <asp:BoundField DataField="Username" HeaderText="Network ID" ReadOnly="True" 
                    SortExpression="Username" />

                <asp:TemplateField>
                    <ItemTemplate>
                        <%# Eval("Name")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="txtEmployeeName" runat="server" Text='<%# Eval("Name")%>' />
                    </EditItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField>
                    <ItemTemplate>
                        <%# Eval("JobTitle")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="txtJobTitle" runat="server" Text='<%# Eval("JobTitle")%>' />
                    </EditItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField>
                    <ItemTemplate>
                        <%# Eval("BadgeNo")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="txtBadgeNo" runat="server" Text='<%# Eval("BadgeNo")%>' />
                    </EditItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField>
                    <ItemTemplate>
                        <%# Eval("IsActive")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:CheckBox ID="isActive" runat="server" Text='<%# Eval("IsActive")%>' />
                    </EditItemTemplate>
                </asp:TemplateField>

            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:UsersInfoDBConnectionString %>" 

            SelectCommand="SELECT     dbo.Divisions.DivisionShortcut, dbo.employee.Username, dbo.employee.Name, dbo.employee.JobTitle, dbo.employee.BadgeNo, dbo.employee.IsActive
FROM         dbo.Divisions INNER JOIN
                      dbo.employee ON dbo.Divisions.SapCode = dbo.employee.DivisionCode">
        </asp:SqlDataSource>

        <asp:SqlDataSource ID="DivisionsListDataSource" runat="server" 
            ConnectionString="<%$ ConnectionStrings:UsersInfoDBConnectionString %>" 
            SelectCommand="SELECT * FROM Divisions">
        </asp:SqlDataSource>

コード ビハインド:

//For updating the information in any row in the GridView
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        GridViewRow gvrow = GridView1.Rows[e.RowIndex];

        DropDownList DivisionsList = (DropDownList)gvrow.FindControl("DivisionsList"); 

        TextBox txtEmployeeName = (TextBox)gvrow.FindControl("txtEmployeeName");
        TextBox txtJobTitle = (TextBox)gvrow.FindControl("txtJobTitle");
        TextBox txtBadgeNo = (TextBox)gvrow.FindControl("txtBadgeNo");

        CheckBox isActive = (CheckBox)gvrow.FindControl("isActive");

        //For getting the ID (primary key) of that row
        string username = GridView1.DataKeys[e.RowIndex].Value.ToString();

        string name = txtEmployeeName.Text;
        string jobTitle = txtJobTitle.Text;
        string badgeNo = txtBadgeNo.Text;

        UpdateEmployeeInfo(username, name, jobTitle, badgeNo);
    }


    private void UpdateEmployeeInfo(string username, string name, string jobTitle, string badgeNo)
    {
        try
        {
            string connString = ConfigurationManager.ConnectionStrings["UsersInfoDBConnectionString"].ConnectionString;
            SqlConnection conn = new SqlConnection(connString);
            string update = @"UPDATE Employee SET Name = @Name, JobTitle = @JobTitle, 
                                                BadgeNo = @BadgeNo 
                            WHERE Username = @Username";
            SqlCommand cmd = new SqlCommand(update, conn);

            cmd.Parameters.AddWithValue("@Name", name);
            cmd.Parameters.AddWithValue("@JobTitle", jobTitle);
            cmd.Parameters.AddWithValue("@BadgeNo", badgeNo);
            cmd.Parameters.AddWithValue("@Username", username);

            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();

            GridView1.EditIndex = -1;
            GridView1.DataBind();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

それで、これを修正するのを手伝ってくれませんか?

4

2 に答える 2

7

SqlDataSource、データベース内の更新を直接行うことができます。

行の更新時に新しい値を取得して、自分で更新を行う必要はありません。

このためには、UpdateCommand

例えば:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:UsersInfoDBConnectionString %>" 
    SelectCommand="SELECT dbo.Divisions.DivisionShortcut, dbo.employee.Username, dbo.employee.Name, dbo.employee.JobTitle, dbo.employee.BadgeNo, dbo.employee.IsActive
        FROM dbo.Divisions INNER JOIN dbo.employee
        ON dbo.Divisions.SapCode = dbo.employee.DivisionCode"
    UpdateCommand="UPDATE Employee SET Name = @Name, JobTitle = @JobTitle, BadgeNo = @BadgeNo
        WHERE Username = @Username">

    <UpdateParameters>
        <asp:Parameter Name="Name" Type="String" />
        <asp:Parameter Name="JobTitle" Type="String" />
        <asp:Parameter Name="BadgeNo" Type="String" />
        <asp:Parameter Name="BadgeNo" Type="String" />
        <asp:Parameter Name="Username" Type="String" />
    </UpdateParameters>               
</asp:SqlDataSource>
于 2012-07-10T04:15:22.577 に答える
-1

あなたのエラーは本当にそれをすべて言います。UpdateCommandを見てください

あなたUpdateEmployeeInfoの機能で試してみてください:

SqlDataSource1.UpdateCommand =  @"UPDATE Employee SET Name = " + name + ", JobTitle = " + jobTitle + ", BadgeNo = " + badgeNo + " WHERE Username = " + username;
SqlDataSource1.Update();

注:テストされていません

于 2012-07-10T04:26:39.663 に答える