SharePoint 2013 TimeJob簡單應用

在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 ,點擊新建項目

clip_image002

2. 新建完SharePoint 空項目後,在項目下新建類,這個類就是作數據備份功能

clip_image003

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 列表查詢語句比較難寫,這裏能夠引用一個工具幫助生成列表的查詢語句

clip_image005

5. 鍵入SharePoint地址後,右側根據當前登陸名的權限篩選出全部的列表信息。這裏選擇」原數據列表」

clip_image007

6. 軟件中間部位顯示出了當前列表的全部字段,根據不一樣字段的篩選條件,能夠查詢到須要到的數據

clip_image009

選中age,選中where,篩選出條件大於12歲的,點擊右側的>按鈕

clip_image011

選擇sex ,勾選中where,選擇and 或or條件,篩選出性別等於男的,點擊右側按鈕

clip_image013

點擊Test 按鈕,下面的結果集就篩選出了年齡大於或等於12歲,性別爲男的數據

clip_image015

點擊左側的Editor 按鈕,能夠查看到當前的結果集的查詢語句。

7. 有了查詢語句後,編寫好類,接下來要託管到計時器任務,點擊Feature,添加功能

clip_image016

8. 重命名後,爲部署的Feature也從新命名,選擇部署範圍

clip_image018

clip_image020

在當前Feature 下按F4 在屬性裏面找到默認激活,選擇False

9. 點擊剛添加的Feature ,添加事件接收器

clip_image021

10. 在事件接收器的代碼中,能夠看到不少方法,從新定義一下

clip_image023

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(解決方案)

clip_image024

12. 部署完成後到SharePoint 管理中心查看是否部署成功

clip_image026

clip_image028

能夠看到solution已經部署成功了

13. 點擊應用程序管理,管理web應用程序,選擇要激活的網站集,點擊管理功能,能夠看到咱們部署的feature,點擊激活

clip_image030

14. 點擊監控,複查做業定義,找到計時器任務

clip_image032

clip_image034

編輯計時器做業,爲了當即看到效果,選擇每分鐘執行,點擊啓用

15. 點擊做業歷史記錄,能夠查看到做業的運行狀態

clip_image036

16. 回到網站,查看備份的列表

clip_image037

數據已經按照篩選條件」年齡大於12歲,性別爲男「篩選數據備份到備份數據列表了。

相關文章
相關標籤/搜索