如何 ︰ 執行批量更新和插入使用.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 鍵關閉控制檯窗口中,當應用程序中止運行時。
注意︰ 此示例不包含任何錯誤處理。
相關文章
相關標籤/搜索