该帖子用于显示如何从网格视图批量更新记录,而不是一个一个地更新。
概念:从后面的代码创建一个xml字符串(字符串将包含所有要使用某些分隔符更新的记录),并将此字符串传递给存储过程,在该过程中,通过从XML数据类型变量中读取数据,这些记录将被更新为适当的表。更新将使用临时表概念完成。
我已使用C#示例代码作为示例:
表结构:
CustId整数
客户名称Varchar(50)
客户位置Varchar(50)
CustCity Varchar(50)
CustState Varchar(50)
网格:
第一
网格视图的设计如下。
<div>
GridView ID=”gvCustomer” runat=”server” AutoGenerateColumns=”False” BackColor=”White”
BorderColor=”#999999″ BorderWidth=”1px” CellPadding=”3″ DataKeyNames=”CustID”
DataSourceID=”SqlDataSource1″ GridLines=”Vertical” BorderStyle=”None” ShowFooter=”True”>
<RowStyle BackColor=”#EEEEEE” ForeColor=”Black” />
<Columns>
<asp:BoundField DataField=”CustID” HeaderText=”CustID” InsertVisible=”False” ReadOnly=”True” SortExpression=”CustID” />
<asp:TemplateField HeaderText=”Name” SortExpression=”CustName”>
<ItemTemplate>
<asp:TextBox ID=”txtName” runat=”server” Text=’<%# Bind(“CustName”) %>’ BorderStyle=”Solid” BorderWidth=”1px”/>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText=”Position” SortExpression=”CustPosition”>
<ItemTemplate>
<asp:TextBox ID=”txtPosition” runat=”server” Text=’<%# Bind(“CustPosition”) %>’ BorderStyle=”Solid” BorderWidth=”1px”/>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText=”City” SortExpression=”CustCity”>
<ItemTemplate>
<asp:TextBox ID=”txtCity” runat=”server” Text=’<%# Bind(“CustCity”) %>’ BorderStyle=”Solid” BorderWidth=”1px”/>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText=”State” SortExpression=”CustState”>
<ItemTemplate>
<asp:TextBox ID=”txtState” runat=”server” Text=’<%# Bind(“CustState”) %>’ BorderStyle=”Solid” BorderWidth=”1px”/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<FooterStyle BackColor=”#CCCCCC” ForeColor=”Black” />
<PagerStyle BackColor=”#999999″ ForeColor=”Black” HorizontalAlign=”Center” />
<SelectedRowStyle BackColor=”#008A8C” ForeColor=”White” Font-Bold=”True” />
<HeaderStyle BackColor=”#000084″ Font-Bold=”True” ForeColor=”White” />
<AlternatingRowStyle BackColor=”#DCDCDC” />
</asp:GridView>
<asp:SqlDataSource ID=”SqlDataSource1″ runat=”server” ConnectionString=”data source=NSL-SEG089D\SQLEXPRESS;database=bankdb;Integrated Security=SSPI”
SelectCommand=”SELECT * FROM [Customer]“></asp:SqlDataSource>
<div align=”center” style=”width: 500px”>
<asp:Button ID=”btnUpdate” runat=”server” Text=”Update” OnClick=”btnUpdate_Click” />
<br />
<br />
<asp:Label ID=”lblError” runat=”server” Font-Bold=”True” ForeColor=”Black” Width=”544px”></asp:Label>
</div>
</div>
以下是更新按钮的OnClick事件代码。
createXml();
string conStr = “data source=YOURDATASOURCE;database=DBNAME;Integrated Security=SSPI”;
SqlConnection con = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand(“UpdateCustomer”, con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(“@XMLCustomer”, sb.ToString());
try
{
using (con)
{
con.Open();
cmd.ExecuteNonQuery();
}
lblError.Text = “Record(s) updated successfully”;
lblError.ForeColor = System.Drawing.Color.Green;
}
catch (Exception ex)
{
lblError.Text = “Error Occured”;
lblError.ForeColor = System.Drawing.Color.Red;
}
}
单击“更新”按钮可调用以下功能,以创建所有要更新记录的xml字符串。
public void createXml()
{
sb.Append(“<root>”);
for (int i = 0; i < gvCustomer.Rows.Count; i++)
{
string CustID = gvCustomer.Rows[i].Cells[0].Text;
TextBox txtName = gvCustomer.Rows[i].FindControl(“txtName”) as TextBox;
TextBox txtPosition = gvCustomer.Rows[i].FindControl(“txtPosition”) as TextBox;
TextBox txtCity = gvCustomer.Rows[i].FindControl(“txtCity”) as TextBox;
TextBox txtState = gvCustomer.Rows[i].FindControl(“txtState”) as TextBox;
sb.Append(“<row CustID=’” + CustID + “‘ Name=’” + txtName.Text.Trim() + “‘ Position=’” + txtPosition.Text.Trim() +
“‘ City=’” + txtCity.Text.Trim() + “‘ State=’” + txtState.Text.Trim() + “‘/>”);
}
sb.Append(“</root>”);
}
最终使用的存储过程(updat客户)如下
proc中使用的参数是XML数据类型。 这将从基于XML创建的临时表中更新客户表。
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[UpdateCustomer]
(
@XMLCustomer XML
)
AS
BEGIN
UPDATE Customer
SET CustName=TempCustomer.Item.value(‘@Name’, ‘VARCHAR(50)’),
CustPosition=TempCustomer.Item.value(‘@Position’, ‘VARCHAR(50)’),
CustCity=TempCustomer.Item.value(‘@City’, ‘VARCHAR(50)’),
CustState=TempCustomer.Item.value(‘@State’, ‘VARCHAR(50)’)
FROM @XMLCustomer.nodes(‘/root/row’) AS TempCustomer(Item)
WHERE CustID=TempCustomer.Item.value(‘@CustID’, ‘INT’)
RETURN 0
END
从下面的屏幕截图中可以看到,我用所有姓氏前缀和名字更新了客户名称字段。
希望它能帮助您批量更新记录。
From: https://bytes.com/topic/sql-server/insights/904364-how-bulk-update-using-sql-server-xml