如何使用SQL Server XML批量更新

这篇博客介绍如何利用XML字符串和存储过程在SQL Server中实现批量更新记录,主要涉及C#编程和数据库操作。文章通过创建XML字符串并传递到存储过程,使用临时表进行更新,提供了一个从网格视图批量更新的解决方案。
摘要由CSDN通过智能技术生成

该帖子用于显示如何从网格视图批量更新记录,而不是一个一个地更新。

概念:从后面的代码创建一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值