GridView からテーブルを更新するときに、データが破損するという小さな問題があります。これが asp.net での最初の試みであることを認めなければなりませんが、C# にはかなり精通しています。
まず、いくつかの背景。MSSQL にデータを保存するサードパーティの在庫/注文処理ソフトウェアがあります。現在の作業指示書を抽出してテーブルに表示するために、GridView と sql クエリを使用しています。SQL クエリは、私が作成したデータベース (tblProdStatus) 内の別のテーブルも組み合わせて、作業指示書に関する追加のステータス情報を追加します。
Web ページを編集して、作業指示書のステータスを更新し、これらの変更をテーブル (tblProdStatus) に書き戻す必要があるようにすることができます。asp.GridView には、適切なパラメーターで定義された UpdateCommand があります。また、更新される行を識別するためにDataKeyNamesを定義しました。
行を編集し、フィールドを更新し、[更新] を選択すると、情報がテーブル (tblProdStatus) に正しく書き込まれます。
私の問題は、編集の進行中にサードパーティのソフトウェアで基になるデータが変更された場合です。3番目のソフトウェアが行を追加または削除したかどうかに応じて、行を上または下にシフトして、データが間違ったレコードに関連付けられてしまいます。
サード パーティ製ソフトウェアには、1 つの作業指示書に関連付けられた AllocID キーがあり、期間中は変更されません。これをテーブル (tblProdStatus) に格納されている同じ番号にリンクして、2 つのテーブルを結び付けます。破損が発生すると、編集中の行の間違った AllocID が SQL 更新に渡されます。更新リンクをクリックするとテーブルが更新され、その後間違った行を使用してデータが送信されたかのようです。
ロジックの実際のコード ビハインドはありません。すべて aspx ファイルにあります。私が投稿したもので、うまくいけば自分自身にとって恥ずかしくないでしょう.
私はstackoverflowを頻繁に使用しており、常に自分の問題で他の人からのガイダンスを見つけることができるように見えるので、これが実際の質問の最初の投稿です. アドバイスをいただきありがとうございます。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="prodStatus.aspx.cs" Inherits="ProdStatus.prodStatus" EnableViewState="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="gvProdStatus" runat="server" AutoGenerateColumns="False" DataKeyNames="AllocID"
DataSourceID="SqlDS" onrowdatabound="gvProdStatus_RowDataBound"
CssClass="table" EnableViewState="False" >
<Columns>
<asp:BoundField DataField="AllocID" HeaderText="AllocID" InsertVisible="False"
ReadOnly="True" SortExpression="AllocID" Visible="false" />
<asp:BoundField DataField="AllocWONo" HeaderText="Works Order"
ReadOnly="True" SortExpression="Works Order" />
<asp:BoundField DataField="ShortNm" HeaderText="Cust"
ReadOnly="True" SortExpression="Cust" />
<asp:BoundField DataField="CustPONo" HeaderText="Cust PO"
ReadOnly="True" SortExpression="Cust PO" />
<asp:BoundField DataField="MasterPNo" HeaderText="Part Number"
ReadOnly="True" SortExpression="Part Number" />
<asp:BoundField DataField="ItemDescription" HeaderText="Description"
ReadOnly="True" SortExpression="Description" />
<asp:BoundField DataField="AllocQty" HeaderText="Qty"
ReadOnly="True" SortExpression="Qty" DataFormatString="{0:G29}" />
<asp:BoundField DataField="ReqdDate" HeaderText="Due"
ReadOnly="True" SortExpression="Due" DataFormatString="{0:d/MMM/yy}" />
<asp:TemplateField HeaderText="Done" SortExpression="state0">
<ItemTemplate>
<asp:CheckBox ID="state0" runat="server" Enabled="false"
Checked='<%#Eval("state0") %>'
Visible='<%#Eval("mask0") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="state0" runat="server"
Checked='<%#Bind("state0") %>'
Visible='<%#Eval("mask0") %>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="<img src='./images/lfp.jpg' alt='Laser Faceplate' />" SortExpression="state1">
<ItemTemplate>
<asp:CheckBox ID="state1" runat="server" Enabled="false"
Checked='<%#Eval("state1") %>'
Visible='<%#Eval("mask1") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="state1" runat="server"
Checked='<%#Bind("state1") %>'
Visible='<%#Eval("mask1") %>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="<img src='./images/lcv.jpg' alt='Laser Cover' />" SortExpression="state2">
<ItemTemplate>
<asp:CheckBox ID="state2" runat="server" Enabled="false"
Checked='<%#Eval("state2") %>'
Visible='<%#Eval("mask2") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="state2" runat="server"
Checked='<%#Bind("state2") %>'
Visible='<%#Eval("mask2") %>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="<img src='./images/hdw.jpg' alt='Hardware Pack' />" SortExpression="state3">
<ItemTemplate>
<asp:CheckBox ID="state3" runat="server" Enabled="false"
Checked='<%#Eval("state3") %>'
Visible='<%#Eval("mask3") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="state3" runat="server"
Checked='<%#Bind("state3") %>'
Visible='<%#Eval("mask3") %>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="<img src='./images/str.jpg' alt='Strike Plate' />" SortExpression="state4">
<ItemTemplate>
<asp:CheckBox ID="state4" runat="server" Enabled="false"
Checked='<%#Eval("state4") %>'
Visible='<%#Eval("mask4") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="state4" runat="server"
Checked='<%#Bind("state4") %>'
Visible='<%#Eval("mask4") %>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="<img src='./images/box.jpg' alt='Box' />" SortExpression="state5">
<ItemTemplate>
<asp:CheckBox ID="state5" runat="server" Enabled="false"
Checked='<%#Eval("state5") %>'
Visible='<%#Eval("mask5") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="state5" runat="server"
Checked='<%#Bind("state5") %>'
Visible='<%#Eval("mask5") %>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="<img src='./images/ins.jpg' alt='Instructions' />" SortExpression="state6">
<ItemTemplate>
<asp:CheckBox ID="state6" runat="server" Enabled="false"
Checked='<%#Eval("state6") %>'
Visible='<%#Eval("mask6") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="state6" runat="server"
Checked='<%#Bind("state6") %>'
Visible='<%#Eval("mask6") %>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="<img src='./images/pcb.jpg' alt='PCBs' />" SortExpression="state7">
<ItemTemplate>
<asp:CheckBox ID="state7" runat="server" Enabled="false"
Checked='<%#Eval("state7") %>'
Visible='<%#Eval("mask7") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="state7" runat="server"
Checked='<%#Bind("state7") %>'
Visible='<%#Eval("mask7") %>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Note" SortExpression="Note">
<ItemTemplate>
<asp:Label ID="notes" runat="server" Text='<%# Eval("notes") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="notes" runat="server" Text='<%# Bind("notes") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowEditButton="True" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDS" runat="server"
ConnectionString="<%$ ConnectionStrings:worksOrdersConnectionString %>"
SelectCommand = "SELECT [AllocID], [tblCustOrders].[CustORID], [tblStockItems].[ItemID], [ReqdDate], [AllocWONo], [ShortNm], [tblAlloc].[AllocQty], [tblCustOrders].[CustPONo], [MasterPNo], [ItemDescription],
ISNULL([mask0], 0) as [mask0],
ISNULL([mask1], 0) as [mask1],
ISNULL([mask2], 0) as [mask2],
ISNULL([mask3], 0) as [mask3],
ISNULL([mask4], 0) as [mask4],
ISNULL([mask5], 0) as [mask5],
ISNULL([mask6], 0) as [mask6],
ISNULL([mask7], 0) as [mask7],
ISNULL([state0], 0) as [state0],
ISNULL([state1], 0) as [state1],
ISNULL([state2], 0) as [state2],
ISNULL([state3], 0) as [state3],
ISNULL([state4], 0) as [state4],
ISNULL([state5], 0) as [state5],
ISNULL([state6], 0) as [state6],
ISNULL([state7], 0) as [state7],
ISNULL([notes], '') as [notes]
FROM (((((([miniMrpDB].[dbo].[tblAlloc]
INNER JOIN [miniMrpDB].[dbo].[tblSalesOrderDetail] ON [tblSalesOrderDetail].[RowID] = [tblAlloc].[SalesRowID])
INNER JOIN [miniMrpDB].[dbo].[tblStockItems] ON [tblStockItems].[ItemID] = [tblSalesOrderDetail].[StockID])
INNER JOIN [miniMrpDB].[dbo].[tblCustOrders] ON [tblCustOrders].[CustORID] = [tblAlloc].[CustORID])
INNER JOIN [miniMrpDB].[dbo].[tblCusAddresses] ON [tblCustOrders].[CustID] = [tblCusAddresses].[AddID])
LEFT JOIN [worksOrders].[dbo].[tblItemMaskBits] ON [tblStockItems].[ItemID] = [tblItemMaskBits].[ItemID])
LEFT JOIN [worksOrders].[dbo].[tblProdStatus] ON [AllocID] = [tblAllocID])
WHERE (Status IS NULL OR Status < 3) AND ([tblAlloc].[CustORID] > -1) AND ([AllocID] < 999999999) ORDER BY [ReqdDate], [ShortNm], [CustPONo], [AllocWONo]"
UpdateCommand = "BEGIN TRAN
IF EXISTS (SELECT * from [worksOrders].[dbo].[tblProdStatus] WITH (updlock,serializable) WHERE [tblAllocID] = (@AllocID))
BEGIN
UPDATE [worksOrders].[dbo].[tblProdStatus] SET
[state0] = (@State0),
[state1] = (@State1),
[state2] = (@State2),
[state3] = (@State3),
[state4] = (@State4),
[state5] = (@State5),
[state6] = (@State6),
[state7] = (@State7),
[notes] = (@Notes)
WHERE [tblAllocID] = (@AllocID)
END
ELSE
BEGIN
INSERT [worksOrders].[dbo].[tblProdStatus] ([tblAllocID], [state0], [state1], [state2], [state3], [state4], [state5], [state6], [state7], [notes])
VALUES ((@AllocID), (@State0), (@State1), (@State2), (@State3), (@State4), (@State5), (@State6), (@State7), (@Notes))
END
COMMIT TRAN" >
<UpdateParameters>
<asp:Parameter Type="Int32" Name="AllocID"></asp:Parameter>
<asp:Parameter Type="Boolean" Name="State0"></asp:Parameter>
<asp:Parameter Type="Boolean" Name="State1"></asp:Parameter>
<asp:Parameter Type="Boolean" Name="State2"></asp:Parameter>
<asp:Parameter Type="Boolean" Name="State3"></asp:Parameter>
<asp:Parameter Type="Boolean" Name="State4"></asp:Parameter>
<asp:Parameter Type="Boolean" Name="State5"></asp:Parameter>
<asp:Parameter Type="Boolean" Name="State6"></asp:Parameter>
<asp:Parameter Type="Boolean" Name="State7"></asp:Parameter>
<asp:Parameter Type="String" Name="Notes"></asp:Parameter>
</UpdateParameters>
</asp:SqlDataSource>
</div>
<br />
<div>
<asp:Button ID="btnReload" runat="server" Text="Reload"
onclick="btnReload_Click" />
<a id="countdown"></p>
</div>
<script>
<!--
(function countdown(remaining) {
if (remaining === 0)
location.reload(true);
document.getElementById('countdown').innerHTML = remaining;
setTimeout(function () { countdown(remaining - 1); }, 1000);
})(600);
//-->
</script>
</form>
</body>
</html>