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

Visio 二次開發實戰:將圖紙設備資訊批次存入資料庫

     編輯:關於C#

在 Visio 二次開發專案中,發布圖紙時往往需將圖檔二進制內容與圖形的自訂屬性(設備資訊)同步寫入資料庫。本文分享一套完整的設備資訊擷取與存儲方案。

資料庫表結構設計

採用「設備類型對應資料表」模式:

  • DeviceTable:管理設備類型與資料表名稱的對應(如「負荷開關」→ Device1,「架空線」→ Device2)。
  • Device1, Device2...:各類型設備的詳細屬性表,欄位對應 Shape 的自訂屬性。

透過 deviceTableDAL.GetDeviceTables() 取得所有類型對應資訊,為後續存儲鋪路。

圖形遍歷與屬性擷取

使用 Window.SelectAll() 選取頁面所有形狀,逐一迭代:

if (VisioUtility.HasShapeInWindow(visWindow)) {
    visWindow.SelectAll();
    foreach (Visio.Shape shape in visWindow.Selection) {
        // 處理每個 shape
    }
    visWindow.DeselectAll();
}

關鍵步驟:根據形狀的「設備類型」屬性查找對應資料表,再動態構建 INSERT 語句。

以資料庫欄位為基準動態生成 SQL

避免 Shape 屬性變更導致欄位不一致,採用 資料庫 Schema 為準:

  1. 查詢目標表的 Schema:SELECT * FROM [Table] WHERE 1=0 搭配 CommandBehavior.SchemaOnly 取得 DataTable。
  2. 提取欄位名稱列表 nameList。
  3. 遍歷欄位,呼叫 VisioUtility.GetShapeCellValue(shape, columnName) 取值,無值則寫 NULL。
  4. 組裝完整 INSERT 語句,批次執行。

核心工具方法

// 取得資料表 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 圖形資料與關係型資料庫無縫對接,支援動態模具擴充,適合電力、網路拓撲等專業繪圖系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved