https://support.microsoft.com/zh-cn/kb/315968

如何 ︰ 执行批量更新和插入使用.NET 提供程序在 C#.NET OpenXML

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 315968

为这篇文章的一个 Microsoft Visual c + +.net 版本,请参阅 316245。 
下面的 Microsoft.net 框架类库命名空间引用这篇文章:

  • System.Data
  • System.Data.SqlClient
 

本任务中

 
概要

本分步指南介绍了如何执行批量插入,用OpenXML方法的更新与其他 Microsoft.NET 数据提供程序。尽管本文中的示例使用 SqlClient 托管提供程序,您还可以使用 OLEDB 或 ODBC 托管提供程序。

返回页首

 

要求

下面的列表列出了推荐使用的硬件、 软件、 网络基础结构和所需的服务包 ︰

  • Microsoft Windows 2000 专业版,Microsoft Windows 2000 服务器,Microsoft Windows 2000 高级服务器或 Microsoft Windows NT 4.0 服务器
  • Microsoft Visual Studio.NET
  • Microsoft SQL Server 2000

返回页首

 

创建项目

  1. 在 SQL Server 中使用以下代码创建一个表 ︰


    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Employee]')
    and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Employee]
    GO CREATE TABLE [dbo].[Employee] (
    [EmployeeId] [int] NOT NULL ,
    [FirstName] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [LastName] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
    ) ON [PRIMARY]
    GO
  2. 在 SQL Server 中使用以下代码创建一个存储的过程 ︰

    CREATE PROC sp_UpdateXML @empdata nText
    AS
    DECLARE @hDoc int
    exec sp_xml_preparedocument @hDoc OUTPUT,@empdata --This code updates old data.
    UPDATE Employee
    SET
    Employee.FirstName = XMLEmployee.FirstName,
    Employee.LastName = XMLEmployee.LastName
    FROM OPENXML(@hDoc, 'NewDataSet/Employee')
    WITH (EmployeeId Integer, FirstName varchar(100), LastName varchar(100)) XMLEmployee
    WHERE Employee.EmployeeId = XMLEmployee.EmployeeId --This code inserts new data. Insert Into Employee
    SELECT EmployeeId, FirstName, LastName
    FROM OPENXML (@hdoc, '/NewDataSet/Employee',1)
    WITH (EmployeeId Integer, FirstName varchar(100), LastName varchar(100)) XMLEmployee
    Where XMLEmployee.EmployeeId Not IN (Select EmployeeID from Employee) EXEC sp_xml_removedocument @hDoc
    GO
  3. Visual Studio 的.NET,开始,然后在 Visual C#.NET 中创建新的控制台应用程序项目。
  4. 复制并将下面的代码粘贴到控制台应用程序中的Class1中 ︰

    using System;
    using System.Data.SqlClient;
    using System.Data; namespace ConsoleApplication1
    {
    /// <summary>
    /// Summary description for Class1
    /// </summary>
    class Class1
    {
    /// <summary>
    /// Main entry point for the application
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    try
    {
    BulkInsertUpdate();
    System.Console.WriteLine("Successfully inserted and updated data");
    System.Console.Read();
    }
    catch (System.Data.SqlClient.SqlException e)
    {
    System.Diagnostics.Debug.WriteLine (e.Message);
    System.Console.WriteLine(e.Message);
    }
    }
    static void BulkInsertUpdate()
    {
    //Steps:
    //1. Create the dataset.
    //2. Update the dataset.
    //3. Insert some data.
    //4. Save the changed data as XML
    // and send XML to SQL Server through the stored procedure. //Declaration
    System.Data.DataSet objDS;
    SqlConnection objCon;
    SqlCommand objCom1;
    SqlDataAdapter objAdpt1;
    String sConn;
    sConn = "user id=myUser;password=YourPassword;" +
    "Database=YourDatabase;Server=YourServer";
    objDS = new DataSet();
    objCon = new SqlConnection(sConn);
    objCon.Open();
    objCom1 = new SqlCommand();
    objCom1.Connection = objCon;
    objAdpt1 = new SqlDataAdapter(); //Step 1: Create the dataset.
    CreateDataSetFromEmployee(objDS, objCom1,objAdpt1); //Step 2: Update the dataset.
    System.Data.DataTable tbl = objDS.Tables["Employee"];
    //DataRow aRow;
    int i = 0;
    foreach (DataRow aRow in tbl.Rows)
    {
    i++;
    aRow["FirstName"] = aRow["FirstName"].ToString() + i;
    aRow["LastName"] = aRow["LastName"].ToString() + i;
    } //Step 3: Insert some data.
    for( int ii = 1; ii <= 5; ii++)
    {
    DataRow newRow = tbl.NewRow();
    int j = ii+100;
    newRow["EmployeeId"] = j;
    newRow["FirstName"] = "Fname" + j;
    newRow["LastName"] = "LName" + j;
    tbl.Rows.Add( newRow);
    } //Step 4: Save the changed data as XML,
    //and send the XML to SQL Server through the stored procedure.
    //In SQL Server, you wrote a stored procedure that
    //accepts this XML and updates the corresponding table. SaveThroughXML(objDS, objCon);
    } static void SaveThroughXML(DataSet objDS, SqlConnection objCon)
    {
    //Change the column mapping first.
    DataTable tbl = objDS.Tables["Employee"];
    System.Text.StringBuilder sb = new System.Text.StringBuilder( 1000);
    System.IO.StringWriter sw = new System.IO.StringWriter(sb); foreach( DataColumn col in tbl.Columns)
    {
    col.ColumnMapping = System.Data.MappingType.Attribute;
    } objDS.WriteXml(sw, System.Data.XmlWriteMode.WriteSchema); SqlCommand objCom = new SqlCommand();
    objCom.Connection = objCon;
    objCom.CommandType = CommandType.StoredProcedure;
    objCom.CommandText = "sp_UpdateXML"; objCom.Parameters.Add( new SqlParameter( "@empdata",
    System.Data.SqlDbType.NText));
    objCom.Parameters[0].Value = sb.ToString();;
    objCom.ExecuteNonQuery();
    } static void CreateDataSetFromEmployee( DataSet objDS,
    SqlCommand objCom1,SqlDataAdapter objAdpt1)
    { //Create related objects.
    objCom1.CommandType = CommandType.Text;
    objCom1.CommandText = "Select EmployeeId, FirstName,LastName from Employee"; //Fill the Orders table.
    objAdpt1.SelectCommand = objCom1;
    objAdpt1.TableMappings.Add("Table", "Employee");
    objAdpt1.Fill(objDS);
    }
    }
    }
  5. 修改为您的环境相应的连接字符串。
  6. 按 F5 键生成并运行该应用程序。
  7. 按 ENTER 键关闭控制台窗口中,当应用程序停止运行时。

注意︰ 此示例不包含任何错误处理。

 

如何 ︰ 执行批量更新和插入使用.NET 提供程序在 C#.NET OpenXML的更多相关文章

  1. mybatis执行批量更新update

    Mybatis的批量插入这里有http://ljhzzyx.blog.163.com/blog/static/38380312201353536375/.目前想批量更新,如果update的值是相同的话 ...

  2. mybatis执行批量更新数据

    1.业务需求:同时执行多记录批量操作 2.实现方法:     1)mapping: 2) dao 层 3)Service 层(注意要使用Transactional,否则可能会导致数据紊乱) 4)Con ...

  3. mybatis执行批量更新batch update 的方法

    1.数据库连接必须配置:&allowMultiQueries=true 我的配置如下:jdbc:mysql://10.20.13.16:3306/CALENDAR?useUnicode=tru ...

  4. Java使用多线程异步执行批量更新操作

    import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; impor ...

  5. Mybatis批量更新和插入

    <update id="updateOrInsert"> <foreach collection="list" index="ind ...

  6. mysql根据查询结果批量更新多条数据(插入或更新)

    mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...

  7. MySql快速插入以及批量更新

    MySql快速插入以及批量更新 插入: MySql提供了可以一次插入多条数据的用法: [sql] INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6), ...

  8. Neo4j 第五篇:批量更新数据

    相比图形数据的查询,Neo4j更新图形数据的速度较慢,通常情况下,Neo4j更新数据的工作流程是:每次数据更新都会执行一次数据库连接,打开一个事务,在事务中更新数据.当数据量非常大时,这种做法非常耗时 ...

  9. Hibernate批量更新和批量删除批量添加(转)

    通常,在一个Session对象的缓存中只存放数量有限的持久化对象,等到Session对象处理事务完毕,还要关闭Session对象,从而及时释放Session的缓存占用的内存.批量处理数据是指在一个事务 ...

随机推荐

  1. MyEclipse使用SVN进行项目版本控制

    一.搭建SVN服务器. 例如,使用VisualSVN Server,下载后安装. (1)在Repositories(版本库)上右击,新建Repository,选择Regular FSFS reposi ...

  2. javascript的字符串模板

    在其他语言存在字符串内插(string interpolation)或者叫变量内插(Variable interpolation).ES6中的称为template string. 模板字符串使用反引号 ...

  3. inux环境PHP7.0安装

    inux环境PHP7.0安装   PHP7和HHVM比较PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM.HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导 ...

  4. Linux下tomcat作为守护进程运行(开机启动、以指定的用户运行、解决非root身份不能绑定1024以下端口的问题)的配置方法

    如题. 参考资料: http://www.jdiy.org/read.jd?id=y0haaynq1w http://blog.csdn.net/shw2004/article/details/578 ...

  5. Swift翻译之-Swift语法入门 Swift语法介绍

    目录[-] Hello world - Swift 简单赋值 控制流 函数与闭包 对象和类 枚举与结构 协议和扩展 泛型 2014.6.3日,苹果公布最新编程语言Swift,Swift是一种新的编程语 ...

  6. powerdesigner设置表主键列为自动增长。

    powerdesigner 版本12.5 创建表就不说了.下面开始介绍设置自动增长列. 1 在表视图的列上创建.双击表视图,打开table properties ———>columens ,双击 ...

  7. iOS 时间处理(转)

    NSDate NSDate对象用来表示一个具体的时间点. NSDate是一个类簇,我们所使用的NSDate对象,都是NSDate的私有子类的实体. NSDate存储的是GMT时间,使用的时候会根据 当 ...

  8. POJ 1260 Pearls

    Pearls Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6670 Accepted: 3248 Description In ...

  9. Common Subsequence(dp)

    Common Subsequence Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 951  Solved: 374 Description A subs ...

  10. [Effective JavaScript 笔记] 第14条:当心命名函数表达式笨拙的作用域

    js函数会根据上下文改变其含义. function double(x){return x*2;} 这是一个函数声明,也可以是一个命名函数表达式(named function expression),取 ...