首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Groove 2007 協作平台整合指南:離線表單收集與 Web Services API 自動同步至 SQL Server

     編輯:關於.NET

Microsoft Office Groove 2007 提供點對點加密同步的協作工作區,解決移動團隊離線收集資料、自動同步上傳的難題。本文示範:建立含自訂表單的 Groove 工作區 → 現場人員離線填寫 → 協調員透過 Groove Web Services API 讀取資料 → 自動寫入 SQL Server 分析,完整端到端解決方案。

Groove 2007 架構優勢

  • 資料本地化:所有資料儲存於參與者 PC,無中央伺服器單點故障
  • 全程加密:磁碟與網路傳輸皆加密,公共 Wi-Fi 環境安全同步
  • 免 VPN:中繼伺服器 (Relay Server) 穿透防火牆,無需企業 VPN
  • 離線優先:斷網繼續工作,上線自動合併衝突

方案架構

  1. 現場端:Tablet PC + Groove Client + 含表單工具的工作區
  2. 協調端:桌機 + Groove Client + 自訂 .NET 應用程式 (連接 SQL Server)
  3. 同步流:現場填寫 → 上線自動同步至協調端 Groove → .NET App 讀取 → 寫入 SQL Server

Groove 表單工具建立問卷

  • 工作區中加入「表單工具」
  • 設計欄位:資料類型、標題、驗證規則
  • 支援 DHTML/CSS 自訂外觀、JavaScript/VBScript 增強邏輯
  • 可匯入 InfoPath 表單定義

.NET 整合開發:Groove Web Services API

雖為用戶端應用,但程式模型為 **本地 Web Services** (Groove Client 代管服務端點)。

1. 讀取註冊表取得端點與認證金鑰

using (var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Office\12.0\Groove")) {
    string grooveHost = $"https://localhost:{key.GetValue("GrooveLocalHTTPPort", 9080)}";
    string requestKey = (string)key.OpenSubKey("WebServices").GetValue("LocalRequestKey");
    // 每次呼叫前重讀,因 RequestKey 會隨 Groove 重啟變更
}

2. 加入 Web 參考 (WSDL)

從 Groove SDK 取得 WSDL,加入專案參考:GrooveAccounts、GrooveForms2、GrooveSpaces、GrooveTools。

3. 列舉帳戶、身分、工作區、工具

// 帳戶與身分
var accountsSvc = new GrooveAccounts.GrooveAccounts { Url = grooveHost + "/GWS/Groove/2.0/Accounts/" };
accountsSvc.GrooveRequestHeaderValue = new GrooveAccounts.GrooveRequestHeader { GrooveRequestKey = requestKey };
var accounts = accountsSvc.Read2(); // Account2[],含 Identities 集合

// 工作區
var spacesSvc = new GrooveSpaces.GrooveSpaces { Url = grooveHost + identity.Spaces };
spacesSvc.GrooveRequestHeaderValue.GrooveIdentityURL = identity.URI;
var spaces = spacesSvc.Read(""); // Space2[]

// 工具 (尋找表單工具)
var toolsSvc = new GrooveTools.GrooveTools { Url = grooveHost + space.Tools };
var tools = toolsSvc.Read(""); // 找 Name="表單" 的 Tool2

4. 查詢表單記錄並轉換為 DataSet

var formsSvc = new GrooveForms2.GrooveForms2 { Url = grooveHost + tool.Url };
formsSvc.GrooveRequestHeaderValue.GrooveRequestKey = requestKey;

var query = new GrooveForms2.RecordQuery {
    ViewURI = "", UnreadRecordsOnly = false, QueryMetadataOnly = false, IncludeFileAttachmentContent = false
};
var recordDataSet = formsSvc.QueryRecords(query); // Forms2RecordDataSet (XML 結構)

// 轉換為 .NET DataSet
var ds = new DataSet();
using (var schemaReader = new StringReader(recordDataSet.SchemaXml)) ds.ReadXmlSchema(schemaReader);
// 修正 DateTimeMode = Utc 避免時區偏移
foreach (DataTable dt in ds.Tables) foreach (DataColumn dc in dt.Columns) if (dc.DataType == typeof(DateTime)) dc.DateTimeMode = DataSetDateTime.Utc;
using (var dataReader = new StringReader(recordDataSet.DataXml)) ds.ReadXml(dataReader);

5. 寫入 SQL Server (去重邏輯)

foreach (DataRow row in ds.Tables["Records"].Rows) {
    string recordId = row["_RecordID"].ToString(); // 系統產生唯一鍵
    using (var cmd = new SqlCommand("MERGE INTO SurveyData USING (SELECT @Id AS RecordID) AS src ON SurveyData.RecordID = src.RecordID WHEN MATCHED THEN UPDATE SET ... WHEN NOT MATCHED THEN INSERT ...", conn)) {
        cmd.Parameters.AddWithValue("@Id", recordId);
        // 映射其他欄位...
        cmd.ExecuteNonQuery();
    }
}

使用 _RecordID 確保冪等性:重複執行只更新不重複插入。

部署與運維注意事項

  • 協調端需同時連接公網 (Groove 同步) 與企業網 (SQL Server)
  • Groove Client 必須保持運行 (服務端點由 Client 代管)
  • 大量資料同步時調整 QueryRecords 分頁或篩選未讀記錄
  • 企業級部署可改用 Groove Server Data Bridge (伺服器端產品,類似 API 模型)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved