【发布时间】:2014-02-04 15:17:49
【问题描述】:
我目前正在创建一个替换前端,用于修改我们的一个用户维护的几个数据库表。使用此接口维护的表为我和我的队友创建的其他应用程序提供数据。
在使用当前使用的前端时,维护此数据的用户有时会创建由给定 CorpNum 的 CorpName 上的多个排列组成的数据行(可能是通过拼写错误,包括不同的、附加的CorpName 字段中的信息等)。这导致我们的应用程序查询数据,为我们的用户提供同一家公司的多项选择,这通常令人困惑。
因此,我希望为维护此数据的用户提供修改 CorpNames 以修复拼写错误或同步某些 CorpNames 的能力,以便每个 CorpNum 仅具有一个与之关联的对应 CorpName。
我正在使用的一个控件是一个 GridView 控件,我已将它绑定到一个 SQL 数据源,其 Select 命令如下:
select distinct CorpNum, CorpName from TableName order by CorpNum asc
我已使此 GridView 可排序(根据请求),并且我还在 GridView 的最左侧列中放置了一个编辑按钮。此编辑操作的更新命令是以下存储过程:
UPDATE TableName SET CorpName = @CorpName WHERE CorpNum = @CorpNum
我看到的奇怪行为如下:
当我单击可能与 GridView 控件中的另一行具有相同 CorpNum 的行的编辑按钮时,该行会自动从 GridView 和数据库表中删除(我正在使用副本进行测试,所以那里没有真正的威胁)。如果我要实际编辑单元格的内容以使我选择的行的 CorpName 与具有相同 CorpNum 的不同行的 CorpName 相同(作为结果的输出),我可能会看到类似的情况发生distinct select 将删除一行),但我没有更改任何内容,也没有单击“更新”按钮。这就是我觉得奇怪的地方。
有什么想法吗?当然,请随时要求任何澄清等。
SqlDataSource 标记如下。
<asp:SqlDataSource ID="sdsCorporationInfo" runat="server"
ConnectionString="<%$ ConnectionStrings:ConnString %>
SelectCommand="select distinct CorpNum,CorpName from Distribution_xx order by CorpNum asc"
onselecting="sdsCorporationInfo_Selecting"
UpdateCommand="sp_XXUpdateCorporationInfo"
UpdateCommandType="StoredProcedure">
<UpdateParameters>
<asp:Parameter Name="CorpNum" Type="Decimal" />
<asp:Parameter Name="CorpName" Type="String" />
</UpdateParameters>
</asp:SqlDataSource>
更新存储过程代码在这里:
PROCEDURE [dbo].[sp_XXUpdateCorporationInfo]
@CorpNum numeric,
@CorpName varchar(40)
AS
UPDATE Distribution_xx SET CorpName = @CorpName WHERE CorpNum = @CorpNum
GridView 标记在这里:
<asp:GridView ID="gvCorporationInfo" runat="server" AutoGenerateColumns="False"
DataSourceID="sdsCorporationInfo" Visible="False"
AllowSorting="True" AutoGenerateEditButton="True"
onrowediting="gvCorporationInfo_RowEdit"
onrowupdated="gvCorporationInfo_RowUpdate"
onrowupdating="gvCorporationInfo_RowUpdating"
<Columns>
<asp:TemplateField HeaderText="Corp #" SortExpression="CorpNum">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("CorpNum") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("CorpNum") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Corp Name" SortExpression="CorpName">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("CorpName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("CorpName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
下面是后面代码中的事件(这里不多):
protected void gvCorporationInfo_Sorting(object sender, GridViewSortEventArgs e)
{
gvCorporationInfo.DataBind();
}
protected void gvCorporationInfo_RowEdit(object sender, GridViewEditEventArgs e)
{
gvCorporationInfo.UpdateRow(e.NewEditIndex, true);
}
运行时GridView内容的一个想法如下:
Corp # Corp Name
Edit 33 Corp Name 1
Edit 37 Corp Name 2
Edit 48 Corp Name 3
Edit 48 Corp Name Three
Edit 51 Corp Name 4
Edit 53 Corp Name 5
Edit 56 Corp Name 6
Edit 57 Corp Name 7
Edit 60 Corp Name 8
Edit 61 Corp Name 9
Edit 63 Corp Name 10
Edit 64 Corp Name 11
Edit 65 Corp Name 12
Edit 66 Corp Name 13
Edit 68 Corp Name 14
Edit 70 Corp Name 15
Edit 71 Corp Name 16
Edit 71 Corp Name Sixteen
TIA
【问题讨论】:
-
我们可能需要更完整的前端代码、后台代码和存储过程来获得更完整的画面。另外,我建议使用 SQL Profiler 来监视您的数据库并捕获在您从应用程序中点击该编辑按钮时执行的命令。这可能有助于展示一些意想不到的东西并给你一些方向。
-
感谢您的回复。我刚刚用 C# 代码、标记、存储过程和运行时的 gridview 内容示例更新了我的帖子。
-
我仍然建议使用 SQL Profiler 查看发送的内容。如果您从未使用过它,我很乐意为您介绍它。这对我来说是最好的故障排除工具。其他需要考虑的东西,参数数据类型。我在尝试像这样在 ASP 中定义数据类型时遇到了奇怪的问题。我通常只是将 SP 中的参数声明为 varchar(),然后将其作为字符串发送。然后我在 SQL 中使用 convert 或 cast 来排列类型。这对我很有效。另一种可能的解决方案是创建您的连接并从后面的代码执行您的 SP。
-
我刚刚确认,如果我将选择查询更改为
-
在 ASP 页面中将更新参数设置为
<asp:Parameter Name="CorpNum">,然后在 SQL SP 中将其声明为 varchar,然后设置 WHERECAST(CorpNum AS INT) = @CorpNum,看看是否有区别。否则,如果您仍然遇到问题并想要一个如何在代码隐藏中进行设置的示例,请告诉我。