在SharePoint 週報功能開發中,遇到一個需求,要求能定時備份列表的數據。web
明確需求後須要考慮如何實現功能,備份步驟以下app
1. 篩選數據webapp
2. 複製數據ide
3. 新增到備份列表工具
咱們能夠用代碼實現數據的備份,然而要考慮的是如何啓動這個開關。有兩種思路網站
1. 添加Ribbon 按鈕手動控制備份,在列表選中相對應的數據,點擊Ribbon按鈕進行備份ui
2. 新增一個計時器任務(TimeJob),按需求篩選符合條件的數據,新增到備份列表中,代碼託管給計時器任務,能夠實現定時備份的功能this
考慮到ribbon按鈕的權限問題,及手動篩選數據,手動備份會因人爲的失誤而致使數據丟失,最終決定使用第二種方式來實現數據備份。.net
方案,步驟都已經肯定好以後,還要考慮技術點server
1. 篩選條件的編寫
2. 備份字段的對應
3. 託管給計時器任務
4. 發佈到SharePoint
5. 激活計時器任務
肯定好方案,步驟,明確好技術點後,接下來就要進行實戰演練
1. 打開VS2013 ,點擊新建項目
2. 新建完SharePoint 空項目後,在項目下新建類,這個類就是作數據備份功能
3. 引用Microsoft SharePoint.dll,重寫類
public class CopyItems:SPJobDefinition
{
public CopyItems()
: base()
{
}
public CopyItems(string jobName, SPService service)
: base(jobName, service, null, SPJobLockType.None)
{
this.Title = "Copy Items";
}
public CopyItems(string jobName, SPWebApplication webapp)
: base(jobName, webapp, null, SPJobLockType.ContentDatabase)
{
this.Title = "Copy Items";
}
public override void Execute(Guid targetInstanceId)
{
//System.Diagnostics.Debugger.Launch();
SPWebApplication webApp = this.Parent as SPWebApplication;
SPSite Site = new SPSite("Http://spserver");
SPWeb Web = Site.OpenWeb("/");
SPList List = Web.Lists["原數據列表"];
SPQuery query = new SPQuery();
query.Query =
@"<Where>
<And>
<Geq>
<FieldRef Name='Age' />
<Value Type='Number'>12</Value>
</Geq>
<Eq>
<FieldRef Name='Sex' />
<Value Type='Choice'>男</Value>
</Eq>
</And>
</Where>";
query.ViewFields = List.DefaultView.ViewFields.SchemaXml;
SPList BakList = Web.Lists["備份數據列表"];
foreach (SPListItem ListItems in List.GetItems(query))
{
SPListItem BakListItems = BakList.Items.Add();
BakListItems["Title"] = ListItems["Title"];
BakListItems["Sex"] = ListItems["Sex"];
BakListItems["Age"] = ListItems["Age"];
BakListItems["Address"] = ListItems["Address"];
BakListItems["Week"] = GetWeekOfYear();
BakListItems.Update();
}
}
private static int GetWeekOfYear()
{
//一.找到第一週的最後一天(先獲取1月1日是星期幾,從而得知第一週週末是幾)
int firstWeekend = 7 - Convert.ToInt32(DateTime.Parse(DateTime.Today.Year + "-1-1").DayOfWeek);
//二.獲取今天是一年當中的第幾天
int currentDay = DateTime.Today.DayOfYear;
//三.(今天減去 第一週週末)/7 等於 距第一週有多少周 再加上第一週的1 就是今天是今年的第幾周了
// 恰好考慮了唯一的特殊狀況就是,今天恰好在第一週內,那麼距第一週就是0 再加上第一週的1 最後仍是1
return Convert.ToInt32(Math.Ceiling((currentDay - firstWeekend) / 7.0)) + 1;
}
}
4. SharePoint 列表查詢語句比較難寫,這裏能夠引用一個工具幫助生成列表的查詢語句
5. 鍵入SharePoint地址後,右側根據當前登陸名的權限篩選出全部的列表信息。這裏選擇」原數據列表」
6. 軟件中間部位顯示出了當前列表的全部字段,根據不一樣字段的篩選條件,能夠查詢到須要到的數據
選中age,選中where,篩選出條件大於12歲的,點擊右側的>按鈕
選擇sex ,勾選中where,選擇and 或or條件,篩選出性別等於男的,點擊右側按鈕
點擊Test 按鈕,下面的結果集就篩選出了年齡大於或等於12歲,性別爲男的數據
點擊左側的Editor 按鈕,能夠查看到當前的結果集的查詢語句。
7. 有了查詢語句後,編寫好類,接下來要託管到計時器任務,點擊Feature,添加功能
8. 重命名後,爲部署的Feature也從新命名,選擇部署範圍
在當前Feature 下按F4 在屬性裏面找到默認激活,選擇False
9. 點擊剛添加的Feature ,添加事件接收器
10. 在事件接收器的代碼中,能夠看到不少方法,從新定義一下
1方法是當Feature激活發生的事件
2方法包括建立一個計時器任務及刪除一個已存在的計時器任務
3方法表示,當Feature被停用時發生的事件
完整代碼以下:
public class ItemsBakEventReceiver : SPFeatureReceiver
{
const string JobName = "Copy Task";
// 取消對如下方法的註釋,以便處理激活某個功能後引起的事件。
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
try
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
SPSite site = properties.Feature.Parent as SPSite;
DeleteExistingJob(JobName, parentWebApp);
CreateJob(parentWebApp);
});
}
catch (Exception ex)
{
throw ex;
}
}
private bool CreateJob(SPWebApplication site)
{
bool jobCreated = false;
try
{
CopyItems job = new CopyItems(JobName, site);
SPMinuteSchedule schedule = new SPMinuteSchedule();
schedule.BeginSecond = 0;
schedule.EndSecond = 59;
schedule.Interval = 1;
job.Schedule = schedule;
job.Update();
}
catch (Exception)
{
return jobCreated;
}
return jobCreated;
}
public bool DeleteExistingJob(string jobName, SPWebApplication site)
{
bool jobDeleted = false;
try
{
foreach (SPJobDefinition job in site.JobDefinitions)
{
if (job.Name == jobName)
{
job.Delete();
jobDeleted = true;
}
}
}
catch (Exception)
{
return jobDeleted;
}
return jobDeleted;
}
// 取消對如下方法的註釋,以便處理在停用某個功能前引起的事件。
public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
lock (this)
{
try
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
foreach (SPJobDefinition job in parentWebApp.JobDefinitions)
{
if (job.Name == JobName)
{
job.Delete();
}
}
});
}
catch (Exception ex)
{
throw ex;
}
}
}
// 取消對如下方法的註釋,以便處理在安裝某個功能後引起的事件。
//public override void FeatureInstalled(SPFeatureReceiverProperties properties)
//{
//}
// 取消對如下方法的註釋,以便處理在卸載某個功能前引起的事件。
//public override void FeatureUninstalling(SPFeatureReceiverProperties properties)
//{
//}
// 取消對如下方法的註釋,以便處理在升級某個功能時引起的事件。
//public override void FeatureUpgrading(SPFeatureReceiverProperties properties, string upgradeActionName, System.Collections.Generic.IDictionary<string, string> parameters)
//{
//}
}
11. 代碼所有完成後,部署該solution(解決方案)
12. 部署完成後到SharePoint 管理中心查看是否部署成功
能夠看到solution已經部署成功了
13. 點擊應用程序管理,管理web應用程序,選擇要激活的網站集,點擊管理功能,能夠看到咱們部署的feature,點擊激活
14. 點擊監控,複查做業定義,找到計時器任務
編輯計時器做業,爲了當即看到效果,選擇每分鐘執行,點擊啓用
15. 點擊做業歷史記錄,能夠查看到做業的運行狀態
16. 回到網站,查看備份的列表
數據已經按照篩選條件」年齡大於12歲,性別爲男「篩選數據備份到備份數據列表了。