在此我将提供一种批量导入数据的方法,效率或许不是很好,所以希望来光临的各位能够分享您的高见。下面就将描述一下我的方法:
首先我们对创建一个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)
{
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存放的数据就行,实现代码如下:
// 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()方法,确保过程的完整性。
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随笔汇总集