zoukankan      html  css  js  c++  java
  • 如何 ︰ 执行批量更新和插入使用.NET 提供程序在 C#.NET OpenXML

    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 键关闭控制台窗口中,当应用程序停止运行时。
    注意︰ 此示例不包含任何错误处理。
     
  • 相关阅读:
    PAT (Advanced Level) Practice 1055 The World's Richest (25 分) (结构体排序)
    PAT (Advanced Level) Practice 1036 Boys vs Girls (25 分)
    PAT (Advanced Level) Practice 1028 List Sorting (25 分) (自定义排序)
    PAT (Advanced Level) Practice 1035 Password (20 分)
    PAT (Advanced Level) Practice 1019 General Palindromic Number (20 分) (进制转换,回文数)
    PAT (Advanced Level) Practice 1120 Friend Numbers (20 分) (set)
    从零开始吧
    Python GUI编程(TKinter)(简易计算器)
    PAT 基础编程题目集 6-7 统计某类完全平方数 (20 分)
    PAT (Advanced Level) Practice 1152 Google Recruitment (20 分)
  • 原文地址:https://www.cnblogs.com/mingyongcheng/p/5411621.html
Copyright © 2011-2022 走看看