次のデータベース設計があります。
Employee Table:
---------------
Username, Name, JobTitle, BadgeNo, IsActive, DivisionCode
Divisions Table:
----------------
SapCode, DivisionShortcut
また、従業員情報の追加、削除、更新/編集に使用している GridView があります。この情報は、従業員の Username、Name、BadgeNo、JobTitle、IsActive (Employee テーブルから) および DivisionShortcut (Divsions テーブルから) です。師団は DropDownList にリストされます。部門は GridView 内の DropDownList として一覧表示され、編集モードで表示されます。この DropDownList を使用して従業員の部門を更新するのに苦労しています。コードを書きましたが、次のエラーが発生しました: *
列名 'DivisionShortcut' が無効です。
ASP.NET コード:
<asp:TemplateField HeaderText="Division"> <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 HeaderText="Name"> <ItemTemplate> <%# Eval("Name")%> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="txtEmployeeName" runat="server" Text='<%# Bind("Name")%>' /> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Job Title"> <ItemTemplate> <%# Eval("JobTitle")%> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="txtJobTitle" runat="server" Text='<%# Bind("JobTitle")%>' /> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Badge No."> <ItemTemplate> <%# Eval("BadgeNo")%> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="txtBadgeNo" runat="server" Text='<%# Bind("BadgeNo")%>' /> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Is Active?"> <ItemTemplate> <%# Eval("IsActive")%> </ItemTemplate> <EditItemTemplate> <asp:CheckBox ID="isActive" runat="server" Checked='<%# Eval("IsActive").ToString().Equals("True") %>'/> </EditItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Delete?"> <ItemTemplate> <span onclick="return confirm('Are you sure to Delete the record?')"> <asp:LinkButton ID="lnkB" runat="Server" Text="Delete" CommandName="Delete"></asp:LinkButton> </span> </ItemTemplate> </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" UpdateCommand="UPDATE [employee], [Divisions] SET [Name] = @Name, [JobTitle] = @JobTitle, [BadgeNo] = @BadgeNo, [DivisionShortcut] = @division WHERE [Username] = @Username" DeleteCommand="DELETE FROM [employee] 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="DivisionShortcut" Type="String" /> <asp:Parameter Name="Username" Type="String" /> </UpdateParameters> <DeleteParameters> <asp:Parameter Name="Username" Type="String" /> </DeleteParameters> </asp:SqlDataSource>
DropDownList には SqlDataSource があることを忘れていました。
<asp:SqlDataSource ID="DivisionsListDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:UsersInfoDBConnectionString %>"
SelectCommand="SELECT * FROM Divisions">
</asp:SqlDataSource>
コード ビハインド:
//For editing any row in the GridView
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
}
//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;
string division = DivisionsList.SelectedValue.ToString();
UpdateEmployeeInfo(username, name, jobTitle, badgeNo, division);
}
private void UpdateEmployeeInfo(string username, string name, string jobTitle, string badgeNo, string division)
{
string connString = ConfigurationManager.ConnectionStrings["UsersInfoDBConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection(connString);
string update = @"UPDATE Employee SET Name = @Name, JobTitle = @JobTitle,
BadgeNo = @BadgeNo, DivisionShortcut = @division
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("@division", division);
cmd.Parameters.AddWithValue("@Username", username);
//cmd.Parameters.AddWithValue("@IsActive", isActive.checked);
try
{
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
GridView1.EditIndex = -1;
// SqlDataSource1.UpdateCommand = @"UPDATE Employee SET Name = @Name, JobTitle = @JobTitle,
// BadgeNo = @BadgeNo
// WHERE Username = @Username";
// SqlDataSource1.Update();
}
catch (Exception ex)
{
throw ex;
}
finally
{
cmd.Dispose();
conn.Close();
conn.Dispose();
}
GridView1.DataBind();
}
では、DropDownList を介して従業員の部門を更新するにはどうすればよいでしょうか?
アップデート:
UpdateEmployeeInfo() メソッドを更新しましたが、それでも同じエラーが発生します。
更新されたコード:
private void UpdateEmployeeInfo(string username, string name, string jobTitle, string badgeNo, string division)
{
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;
UPDATE Divisions SET [DivisionShortcut] = @division WHERE SapCode = @SapCode;";
SqlCommand cmd = new SqlCommand(update, conn);
cmd.Parameters.AddWithValue("@Name", name);
cmd.Parameters.AddWithValue("@JobTitle", jobTitle);
cmd.Parameters.AddWithValue("@BadgeNo", badgeNo);
cmd.Parameters.AddWithValue("@division", division);
cmd.Parameters.AddWithValue("@Username", username);
//cmd.Parameters.AddWithValue("@IsActive", isActive.checked);
try
{
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
GridView1.EditIndex = -1;
}
catch (Exception ex)
{
throw ex;
}
finally
{
cmd.Dispose();
conn.Close();
conn.Dispose();
}
GridView1.DataBind();
}