zoukankan      html  css  js  c++  java
  • sharepoint 2010批量导入数据

            在此我将提供一种批量导入数据的方法,效率或许不是很好,所以希望来光临的各位能够分享您的高见。下面就将描述一下我的方法:

    首先我们对创建一个Console应用程序,然后在里面书写批量导入数据的代码,在这里使用Console的时候可能会遇到不能成功引用sharepoint对象的问题,此时请参考我的另外一篇博文:http://www.cnblogs.com/towerking/archive/2011/11/15/2249560.html。

         程序中需要引用的dll如下所述:

    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Utilities;
    using System.Diagnostics;
    using System.Data;

          一下将是我编这个测试程序的思路,在这儿程序中将会创建四个方法来完成这个过程,原因是我想尽可能少修改代码,完成尽可能多的变化,至于效果如何,望各位提出您宝贵的意见。

         我所写的四个方法分别是:

    /// <summary>
    /// 批量插入数据
    /// </summary>
    public void InsertBatchData(){}

    /// <summary>
    /// 插入sharepoint列表中满足要求的批量字符串
    /// </summary>
    /// <param name="guid">列表GUID</param>
    /// <param name="filedString">sharepoint列表字段名数组</param>
    /// <param name="table">表格数据源</param>
    /// <returns></returns>
    public string GetInsertBatchString(System.Guid guid, string[] filedString, DataTable table){}


    /// <summary>
    /// 返回列表内部名字段字符串数组
    /// </summary>
    /// <returns></returns>
    public string[] GetFieldString(){}

    /// <summary>
    /// 获取表格数据,列名是列表字段名
    /// </summary>
    /// <param name="fieldString"></param>
    /// <returns></returns>
    public DataTable GetTable(string[] fieldString){}

          上面的方法可以根据各位看官的需求进行相应的更改,以满足各位更大的需求,下面我将贴出我做这个测试几个方法的代码出来,首先是InsertBatchData()方法,这个方法就是让用户调用的一个方法,实现sharepoint类表批量导入数据的功能,代码如下:

    public void InsertBatchData()
    {
        using (SPSite site = new SPSite("http://localhost"))
        {
            using (SPWeb web = site.OpenWeb())
            {
                Stopwatch watch = new Stopwatch();
                watch.Start();
                SPList oList = web.Lists["BatchList"];
                System.Guid guid = oList.ID;
                string[] fieldString = (new Program()).GetFieldString();
                DataTable dataTable = (new Program()).GetTable(fieldString);
                string strPost = (new Program()).GetInsertBatchString(guid,
                    fieldString,dataTable);
                string strProcessBatch = web.ProcessBatchData(strPost);
                Console.WriteLine("运行时间:" + watch.ElapsedMilliseconds);
            }
        }
    }

          获取批量导入数据的字符串方法,利用简单的循环可以减少大量的重复性工作的:

    public string GetInsertBatchString(System.Guid guid, string[] filedString, DataTable table)...
    public string GetInsertBatchString(System.Guid guid, string[] filedString, DataTable table)
    {
    string strGuid = Convert.ToString(guid);
    StringBuilder insertBatchStringBuilder = new StringBuilder();
    insertBatchStringBuilder.Append
    ("<?xml version=\"1.0\" encoding=\"UTF-8\"?><ows:Batch OnError=\"Return\">");
    foreach (DataRow dataRow in table.Rows)
    {
    insertBatchStringBuilder.Append("<Method ID=\"A1\">");
    insertBatchStringBuilder.Append("<SetList>");
    insertBatchStringBuilder.Append(strGuid);
    insertBatchStringBuilder.Append("</SetList>");
    insertBatchStringBuilder.Append
    ("<SetVar Name=\"ID\">New</SetVar><SetVar Name=\"Cmd\">Save</SetVar>");

    for (int fieldNo = 0; fieldNo < filedString.Length; fieldNo++)
    {
    insertBatchStringBuilder.Append("<SetVar Name=\"urn:schemas-microsoft-com:office:office#");
    // 字段明
    insertBatchStringBuilder.Append(filedString[fieldNo]);
    insertBatchStringBuilder.Append("\">");
    insertBatchStringBuilder.Append(dataRow[filedString[fieldNo]]);
    insertBatchStringBuilder.Append("</SetVar>");
    }
    insertBatchStringBuilder.Append("</Method>");
    }
    insertBatchStringBuilder.Append("</ows:Batch>");
    return Convert.ToString(insertBatchStringBuilder);
    }

          提供一个获取sharepoint列表内部名的字符串数组方法,方便给不同的列表进行操作的时候,只需要修改这个方法就行,而不用管批量导入数据字符串的修改,注意这里需要的字段时内部名而不是显示名。我在这个测试程序中只是为列表提供了三个字段,即Title,No,Description,所以其方法实现如下:

    public string[] GetFieldString()
    {
    string[] fieldString = {"Title", "No", "Description"};
    return fieldString;
    }

          最后只剩下了一个数据源的导入,我这的数据源是生成了一个Datatable存放的数据,看官们可以根据自己的需求更改这个Datatable存放的数据就行,实现代码如下:

    public DataTable GetTable(string[] fieldString)...
    // fieldString是sharepoint列表字段,这里映射到table列名中
    public DataTable GetTable(string[] fieldString)
    {
    DataTable dataTable = new DataTable();
    for (int i = 0; i < fieldString.Length; i++)
    {
    dataTable.Columns.Add(fieldString[i], System.Type.GetType("System.String"));
    }
    for (int num = 0; num < 5000; num++)
    {
    DataRow dataRow = dataTable.NewRow();
    for (int i = 0; i < fieldString.Length; i++)
    {
    dataRow[fieldString[i]] = fieldString[i] + num;
    }
    dataTable.Rows.Add(dataRow);
    }
    return dataTable;
    }

          编写一个主程序调用InsertBatchData()方法,确保过程的完整性。

    Main Code
    static void Main(string[] args)
    {
    Console.WriteLine("Begin:");
    (new Program()).InsertBatchData();
    Console.WriteLine("End!");
    Console.ReadKey();
    }

          以上就是我完成这个测试程序的全过程以及设计思路,各位给点意见吧,嘿嘿。

    参考资料如下:

    http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.processbatchdata.aspx

    本文来自:TowerKing随笔汇总集




  • 相关阅读:
    4500-X验证镜像完整性
    激活4500-X RTU license
    Nexus:hardware type changed to No-Transceiver
    Bug搬运工-CSCvf74866:Webauth scaling improvements
    win10无法登陆SSG进行WEB UI管理
    FTD vs FMC
    转:思科3750交换机堆叠技术配置向导
    ROM, RAM, NVRAM and Flash Memory on Cisco Routers
    RADIUS Authentication with WPA2-Enterprise
    BUG搬运工:CSCun88303-CIMC Memory Leak : Can't SSH/HTTP to CIMC
  • 原文地址:https://www.cnblogs.com/towerking/p/2324437.html
Copyright © 2011-2022 走看看