zoukankan      html  css  js  c++  java
  • C#进行Visio二次开发之图纸设备信息的保存

    在Visio的二次开发中,当发布图纸的时候,我们往往需要保存图纸和图纸的设备信息到数据库,图纸是将文件以二进制保存到数据库中,设备信息是保存图纸对应的Shape的各种自定义属性。本文主要介绍如何保存图纸背后的设备信息。
    这里图纸的设备信息可以通过一个设备表如Device1来放置同一类型的设备信息,如负荷开关存放在Device1,架空线放在Device2等等,Device(n)是我们详细放置某种类型设备的表,其结构如下
    VisioEquip_Devicen.jpg

    另外主要我们再新建一个表来管理那种类型的设备对应那个表即可。如下图所示:
    VisioEquip_DeviceTable.jpg
    一旦建立了上表的关系,我们就知道那个类型的设备对应的表名是多少了。我们通过代码
    List<DeviceTableInfo> deviceTables = deviceTableDAL.GetDeviceTables();
    就可以获取到所有的设备类型表的信息了,这可以为我们下一步保存设备信息做准备。
    为了获取到某个设备类型对应的表信息,我们可以这样拿到它的对应信息。
                        string deviceType = VisioUtility.GetShapeCellValue(shape, "设备类型");
                        DeviceTableInfo tableInfo 
    = deviceTableDAL.GetTableNameByDevice(deviceTables, deviceType);

    我们知道,图纸有很多信息,我们遍历图纸设备的时候,可以通过遍历其选区实现,如下所示
                if (VisioUtility.HasShapeInWindow(visWindow))
                
    {
                    visWindow.SelectAll();
                    
    foreach (Visio.Shape shape in visWindow.Selection)
                    
    {
                             }

                    visWindow.DeselectAll();
                }

    这样,我们有表的信息,又有了图纸设备遍历的方法,那我们就可以根据这些信息,生成保存每个设备的SQL语句了,你说是么?因为每个Shape有很多属性信息,我们把属性信息保存到数据库就可以了啊。

    说到这里,我们需要注意一个问题,设备有很多属性列表,数据库也有很多字段属性列表,我们需要以一个为准,作为Sql语句字段列表的标准,否则就会出现问题。由于取本地Shape的属性虽然方便,但是由于其可能因为模具属性变化可能和数据库的字段列表不再一致,因此还是以数据库字段列表为准比较妥当。
    为了获取某个表的字段列表信息,我们需要使用下面代码(该代码是我代码生成工具的基本函数来的,呵呵)
            private DataTable GetReaderSchema(string tableName)
            
    {
                DataTable schemaTable 
    = null;

                
    string sql = string.Format("select * from [{0}]", tableName);
                Database db 
    = DatabaseFactory.CreateDatabase();
                
    using (DbConnection connnection = db.CreateConnection())
                
    {
                    connnection.Open();

                    DbCommand dbCommand 
    = db.GetSqlStringCommand(sql);
                    dbCommand.Connection 
    = connnection;

                    
    using (IDataReader reader = dbCommand.ExecuteReader(CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly))
                    
    {
                        schemaTable 
    = reader.GetSchemaTable();
                    }

                }


                
    return schemaTable;
            }
     

    上面的函数是获取表的Schema信息,通过获取对应的信息,我们就知道一个表有那些字段了,下面的代码是实现把字段信息写到列表中。
                DataTable schemaTable = GetReaderSchema(tableName);
                List
    <string> nameList = new List<string>();
                
    foreach (DataRow dr in schemaTable.Rows)
                
    {
                    nameList.Add(dr[
    "ColumnName"].ToString());
                }

    然后,通过遍历字段列表,我们就知道Insert语句的字段列表了,为了找到对应某个字段的值,我们可以使用下面代码实现获取Shape属性对应的值(有则拿出来,否则赋给NULL)

                    string value = VisioUtility.GetShapeCellValue(shape, column.ColumnName);

                    
    if(!string.IsNullOrEmpty(value))
                    
    {
                        sqlValues 
    += string.Format("'{0}',", value);
                    }

                    
    else
                    
    {
                        sqlValues 
    += "NULL,";
                    }

    这样我们就可以构造完成一个Shape的Insert语句了,其他的也就如此这般就OK啦。其实就是在刚才的遍历函数中,生成每一条Sql语句,放到列表中,然后统一执行这些Sql语句就实现设备的保存工作了。
    VisioEquip_Data.jpg
    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    Ascx中引用(调用)JS文件,在用户控件中引用(调用)JS文件转载
    网页速度优化 转载
    枚举,以及中文对应解释 转载
    js鼠标事件转载
    开源相关社区/项目一览
    字符编码 转载
    防止ASP.NET按钮多次提交的办法
    sql数据库基本语法
    你需要了解的关于浮动的一些概念
    CSS样式important和*和_:兼容IE、Firefox、Opera和Safari CSS的解决方法及CSS差别
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/1217141.html
Copyright © 2011-2022 走看看