我是 ASP.NET/C# 的菜鸟,但我会尽力尽可能地描述我的问题。
现在我有一个 gridview,它附加了一个 sql 源;它获取正确的信息。 gridview 的信息将根据在网格之外的下拉列表中选择的内容而变化,这是有效的。问题出在更新和插入上。
一旦尝试更新。 (当我单击其中一列上的“编辑”时)我收到以下错误消息:“DropDownList2”有一个无效的 SelectedValue,因为它不存在于项目列表中。 参数名称:值
我将列拆分为模板,如下所示,这样我可以更轻松地管理它们。 “下拉列表 2”位于我的编辑模板中。它连接到数据源;这与我的第一个下拉菜单的来源完全相同,可以完美地工作。所以我不相信这会是该过程背后的sql。不过,我确实将这个下拉列表 2 绑定(bind)到了医生。 现在我被告知要绑定(bind)它,所以我不知道绑定(bind)是如何工作的
如果我取消绑定(bind),至少在单击编辑后仍然可以看到网格,但在更新后收到错误消息:过程或函数 uspPatientUpdate 指定了太多参数。
现在我在网上寻找解决方案,但我无法理解绑定(bind)。我将根据需要提供以下代码。
ASP:
<asp:SqlDataSource ID="sdPatient" runat="server" ConnectionString="<%$ ConnectionStrings:MedicalOfficeConnectionString %>" DeleteCommand="usp_PatientDelete" InsertCommand="uspPatientInsert" SelectCommand="uspPatientSelectByIDOrSelectAll" UpdateCommand="uspPatientUpdate" SelectCommandType="StoredProcedure" DeleteCommandType="StoredProcedure" InsertCommandType="StoredProcedure" UpdateCommandType="StoredProcedure">
<DeleteParameters>
<asp:Parameter Name="ID" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="OHIP" Type="String" />
<asp:Parameter Name="FirstName" Type="String" />
<asp:Parameter Name="LastName" Type="String" />
<asp:Parameter DbType="Date" Name="DOB" />
<asp:Parameter Name="VisitsPerYear" Type="Int32" />
<asp:Parameter Name="DoctorID" Type="Int32" />
<asp:Parameter Name="Timestamp" Type="Byte"></asp:Parameter>
</InsertParameters>
<SelectParameters>
<asp:ControlParameter ControlID="DropDownList1" Name="DoctorID" PropertyName="SelectedValue" Type="Int32" DefaultValue="0" />
</SelectParameters>
<UpdateParameters>
<asp:Parameter Name="ID" Type="Int32" />
<asp:Parameter Name="OHIP" Type="String" />
<asp:Parameter Name="FirstName" Type="String" />
<asp:Parameter Name="LastName" Type="String" />
<asp:Parameter DbType="Date" Name="DOB" />
<asp:Parameter Name="VisitsPerYear" Type="Int32" />
<asp:Parameter Name="DoctorID" Type="Int32" />
<asp:Parameter Name="ID" Type="Int32" />
<asp:Parameter Name="Timestamp" Type="Byte"></asp:Parameter>
</UpdateParameters>
</asp:SqlDataSource>
<p>Select Patient By Doctor:<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" DataSourceID="sdDoctorList" DataTextField="Doctor" DataValueField="ID" AppendDataBoundItems="True">
<asp:ListItem Value="0">All Doctors</asp:ListItem>
</asp:DropDownList>
<asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False" BackColor="White" BorderColor="#336666" BorderStyle="Double" BorderWidth="3px" CellPadding="4" DataSourceID="sdPatient" GridLines="Horizontal">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
<asp:TemplateField HeaderText="OHIP" SortExpression="OHIP">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("OHIP") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("OHIP") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="First Name" SortExpression="FirstName">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("FirstName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("FirstName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Last Name" SortExpression="LastName">
<EditItemTemplate>
<asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("LastName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("LastName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="DOB" SortExpression="DOB">
<EditItemTemplate>
<asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("DOB") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("DOB") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Visits Per Year" SortExpression="VisitsPerYear">
<EditItemTemplate>
<asp:TextBox ID="TextBox5" runat="server" Text='<%# Bind("VisitsPerYear") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label5" runat="server" Text='<%# Bind("VisitsPerYear") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Doctor" SortExpression="Doctor">
<EditItemTemplate>
<asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="sdDoctorList" DataTextField="Doctor" DataValueField="ID" SelectedValue='<%# Bind("Doctor") %>'>
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label6" runat="server" Text='<%# Bind("Doctor") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<FooterStyle BackColor="White" ForeColor="#333333" />
<HeaderStyle BackColor="#336666" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#336666" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="White" ForeColor="#333333" />
<SelectedRowStyle BackColor="#339966" Font-Bold="True" ForeColor="White" />
<SortedAscendingCellStyle BackColor="#F7F7F7" />
<SortedAscendingHeaderStyle BackColor="#487575" />
<SortedDescendingCellStyle BackColor="#E5E5E5" />
<SortedDescendingHeaderStyle BackColor="#275353" />
</asp:GridView>
程序:
这是用于下拉列表的。这给出了名称和值。 *注意:此过程适用于第一个下拉列表,我想也适用于第二个下拉列表。
ALTER PROCEDURE dbo.uspDoctorList
AS
BEGIN
SET NOCOUNT ON
SELECT ID, LastName +', ' + FirstName AS 'Doctor'
FROM Doctor
ORDER BY 'Doctor'
END
这是更新过程。不确定这是否是错误,或者只是我的 ASP
ALTER PROCEDURE dbo.uspPatientUpdate
@ID int,
@OHIP char(10),
@FirstName nvarchar(20),
@LastName nvarchar(40),
@DOB date,
@VisitsPerYear int,
@DoctorID int,
@Timestamp Timestamp
AS
BEGIN
SET NOCOUNT OFF
UPDATE Patient
SET OHIP = @OHIP,
FirstName = @FirstName,
LastName = @LastName,
DOB = @DOB,
VisitsPerYear = @VisitsPerYear,
DoctorID = @DoctorID
WHERE ID = @ID AND Timestamp = @Timestamp
END
我将不胜感激任何帮助。顺便说一句,这些东西比我们所教的要先进一些(使用 ASP 中的存储过程),我会加倍努力以获得奖励分数.. 提前致谢。
如果您需要更多信息,请询问
最佳答案
问题1 - 在gridview中更新数据
1) 正如 Andriy 所指出的,您的第一个问题是 ID 在 <UpdateParameters>
中列出了两次,删除其中之一。
2) 从参数列表中删除时间戳,timestamps are updated automatically
<UpdateParameters>
<asp:Parameter Name="ID" Type="Int32" />
<asp:Parameter Name="OHIP" Type="String" />
<asp:Parameter Name="FirstName" Type="String" />
<asp:Parameter Name="LastName" Type="String" />
<asp:Parameter Name="DOB" DbType="DateTime" />
<asp:Parameter Name="VisitsPerYear" Type="Int32" />
<asp:Parameter Name="DoctorID" Type="Int32" />
</UpdateParameters>
注意:如果您需要保存日期时间戳,请在 SQL 中将时间戳列的数据类型更改为日期时间,并更改存储的更新程序为 - Patient.Timestamp = GETDATE()
3)从更新存储过程中删除@Timestamp(作为参数和WHERE子句)
4) 在gridview的标记中设置DataKeyNames="ID"
这非常重要,请使用DataKeyNames属性来指定表示数据源主键的字段,必须设置它才能使 GridView 控件的自动更新和删除功能发挥作用:
<asp:GridView
ID="GridView1"
DataKeyNames="ID"
完成上述所有操作后,您的更新将起作用,我使用 SQL Server Express 2008 和 ASP.NET 4.0 为您创建了一个示例项目,您可以找到它 here在 Google 驱动器上(只需单击"file"->“下载”即可获取 .zip 项目)
问题2 - 在gridview中插入数据并刷新
1) 更改<InsertParameters>
从控件获取数据(我展示的示例只有四个参数,您可以根据需要更改它)
<InsertParameters>
<asp:ControlParameter ControlID="txtOhip" Name="OHIP" />
<asp:ControlParameter ControlID="txtFirstName" Name="FirstName" />
<asp:ControlParameter ControlID="txtLastName" Name="LastName" />
<asp:ControlParameter ControlID="ddlDoctorId" Name="DoctorID" PropertyName="SelectedValue" />
</InsertParameters>
2)在页面中添加插入控件,调用Insert()
当用户点击添加按钮时你的sql数据源的方法:
<table>
<tr>
<td>
OHIP
</td>
<td>
<asp:TextBox ID="txtOhip" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
First name
</td>
<td>
<asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
Last name
</td>
<td>
<asp:TextBox ID="txtLastName" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
Doctor
</td>
<td>
:<asp:DropDownList ID="ddlDoctorId" runat="server" AutoPostBack="True" DataSourceID="sdDoctorList"
DataTextField="Doctor" DataValueField="DoctorID" AppendDataBoundItems="True">
<asp:ListItem Value="0">All Doctors</asp:ListItem>
</asp:DropDownList>
</td>
</tr>
<tr>
<td style="text-align: right" colspan="2">
<asp:Button ID="btnAdd" OnClick="Add" runat="server" Text="Add" />
</td>
</tr>
</table>
<script runat="server">
protected void Add(object sender,EventArgs e)
{
sdPatient.Insert();
}
</script>
关于asp.net - 插入和更新问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15870247/