在 Visio 二次開發專案中,發布圖紙時往往需將圖檔二進制內容與圖形的自訂屬性(設備資訊)同步寫入資料庫。本文分享一套完整的設備資訊擷取與存儲方案。
採用「設備類型對應資料表」模式:
透過 deviceTableDAL.GetDeviceTables() 取得所有類型對應資訊,為後續存儲鋪路。
使用 Window.SelectAll() 選取頁面所有形狀,逐一迭代:
if (VisioUtility.HasShapeInWindow(visWindow)) {
visWindow.SelectAll();
foreach (Visio.Shape shape in visWindow.Selection) {
// 處理每個 shape
}
visWindow.DeselectAll();
}
關鍵步驟:根據形狀的「設備類型」屬性查找對應資料表,再動態構建 INSERT 語句。
避免 Shape 屬性變更導致欄位不一致,採用 資料庫 Schema 為準:
SELECT * FROM [Table] WHERE 1=0 搭配 CommandBehavior.SchemaOnly 取得 DataTable。nameList。VisioUtility.GetShapeCellValue(shape, columnName) 取值,無值則寫 NULL。// 取得資料表 Schema
private DataTable GetReaderSchema(string tableName) {
string sql = $"select * from [{tableName}]";
using (var conn = db.CreateConnection()) {
conn.Open();
using (var cmd = db.GetSqlStringCommand(sql)) {
cmd.Connection = conn;
using (var reader = cmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly)) {
return reader.GetSchemaTable();
}
}
}
}
// 從 Shape 取值並組 SQL 片段
string value = VisioUtility.GetShapeCellValue(shape, columnName);
sqlValues += string.IsNullOrEmpty(value) ? "NULL," : $"'{value}',";
此方案將 Visio 圖形資料與關係型資料庫無縫對接,支援動態模具擴充,適合電力、網路拓撲等專業繪圖系統。