C#进行Visio二次开发之图纸设备信息的保存

简介:
在Visio的二次开发中,当发布图纸的时候,我们往往需要保存图纸和图纸的设备信息到数据库,图纸是将文件以二进制保存到数据库中,设备信息是保存图纸对应的Shape的各种自定义属性。本文主要介绍如何保存图纸背后的设备信息。
这里图纸的设备信息可以通过一个设备表如Device1来放置同一类型的设备信息,如负荷开关存放在Device1,架空线放在Device2等等,Device(n)是我们详细放置某种类型设备的表,其结构如下
VisioEquip_Devicen.jpg
另外主要我们再新建一个表来管理那种类型的设备对应那个表即可。如下图所示:
VisioEquip_DeviceTable.jpg
一旦建立了上表的关系,我们就知道那个类型的设备对应的表名是多少了。我们通过代码
None.gifList<DeviceTableInfo> deviceTables = deviceTableDAL.GetDeviceTables();
就可以获取到所有的设备类型表的信息了,这可以为我们下一步保存设备信息做准备。
为了获取到某个设备类型对应的表信息,我们可以这样拿到它的对应信息。
None.gif                     string deviceType = VisioUtility.GetShapeCellValue(shape,  " 设备类型 ");
None.gif                    DeviceTableInfo tableInfo = deviceTableDAL.GetTableNameByDevice(deviceTables, deviceType);
我们知道,图纸有很多信息,我们遍历图纸设备的时候,可以通过遍历其选区实现,如下所示
None.gif             if (VisioUtility.HasShapeInWindow(visWindow))
ExpandedBlockStart.gif             {
InBlock.gif                visWindow.SelectAll();
InBlock.gif                foreach (Visio.Shape shape in visWindow.Selection)
ExpandedSubBlockStart.gif                {
ExpandedSubBlockEnd.gif                         }

InBlock.gif                visWindow.DeselectAll();
ExpandedBlockEnd.gif            }
这样,我们有表的信息,又有了图纸设备遍历的方法,那我们就可以根据这些信息,生成保存每个设备的SQL语句了,你说是么?因为每个Shape有很多属性信息,我们把属性信息保存到数据库就可以了啊。
说到这里,我们需要注意一个问题,设备有很多属性列表,数据库也有很多字段属性列表,我们需要以一个为准,作为Sql语句字段列表的标准,否则就会出现问题。由于取本地Shape的属性虽然方便,但是由于其可能因为模具属性变化可能和数据库的字段列表不再一致,因此还是以数据库字段列表为准比较妥当。
为了获取某个表的字段列表信息,我们需要使用下面代码(该代码是我代码生成工具的基本函数来的,呵呵)
None.gif         private DataTable GetReaderSchema( string tableName)
ExpandedBlockStart.gif         {
InBlock.gif            DataTable schemaTable = null;
InBlock.gif
InBlock.gif            string sql = string.Format("select * from [{0}]", tableName);
InBlock.gif            Database db = DatabaseFactory.CreateDatabase();
InBlock.gif            using (DbConnection connnection = db.CreateConnection())
ExpandedSubBlockStart.gif            {
InBlock.gif                connnection.Open();
InBlock.gif
InBlock.gif                DbCommand dbCommand = db.GetSqlStringCommand(sql);
InBlock.gif                dbCommand.Connection = connnection;
InBlock.gif
InBlock.gif                using (IDataReader reader = dbCommand.ExecuteReader(CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly))
ExpandedSubBlockStart.gif                {
InBlock.gif                    schemaTable = reader.GetSchemaTable();
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

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

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

None.gif                 string value = VisioUtility.GetShapeCellValue(shape, column.ColumnName);
None.gif
None.gif                 if(! string.IsNullOrEmpty(value))
ExpandedBlockStart.gif                 {
InBlock.gif                    sqlValues += string.Format("'{0}',", value);
ExpandedBlockEnd.gif                }

None.gif                 else
ExpandedBlockStart.gif                 {
InBlock.gif                    sqlValues += "NULL,";
ExpandedBlockEnd.gif                }
这样我们就可以构造完成一个Shape的Insert语句了,其他的也就如此这般就OK啦。其实就是在刚才的遍历函数中,生成每一条Sql语句,放到列表中,然后统一执行这些Sql语句就实现设备的保存工作了。

VisioEquip_Data.jpg

本文转自博客园伍华聪的博客,原文链接:C#进行Visio二次开发之图纸设备信息的保存,如需转载请自行联系原博主。



目录
相关文章
|
存储 传感器 API
C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.)
原文:C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.) 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.
1545 0
|
1月前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
22 0
|
2月前
|
SQL 数据库连接 应用服务中间件
C#WinForm基础编程(三)
C#WinForm基础编程
78 0
|
2月前
C#WinForm基础编程(二)
C#WinForm基础编程
59 0
|
2月前
|
C# 数据安全/隐私保护
C#WinForm基础编程(一)
C#WinForm基础编程
62 0
|
4月前
|
数据采集 前端开发 C#
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
Twitter是全球最大的社交媒体平台之一,包含丰富的音频资源。用户可以在Twitter上发布、转发、评论和收听各种音频内容,如音乐、播客、新闻、故事等,直接从Twitter抓取音频数据并非易事,尤其是在考虑到可能的封锁和反爬虫机制。Twitter会对频繁访问的IP地址进行限制或封禁,以防止恶意爬虫的行为。因此,我们需要使用一些技术手段来规避这些障碍,确保稳定而高效的数据访问。
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频