在Visio的二次开发中,当发布图纸的时候,我们往往需要保存图纸和图纸的设备信息到数据库,图纸是将文件以二进制保存到数据库中,设备信息是保存图纸对应的Shape的各种自定义属性。本文主要介绍如何保存图纸背后的设备信息。
这里图纸的设备信息可以通过一个设备表如Device1来放置同一类型的设备信息,如负荷开关存放在Device1,架空线放在Device2等等,Device(n)是我们详细放置某种类型设备的表,其结构如下
另外主要我们再新建一个表来管理那种类型的设备对应那个表即可。如下图所示:
一旦建立了上表的关系,我们就知道那个类型的设备对应的表名是多少了。我们通过代码
为了获取到某个设备类型对应的表信息,我们可以这样拿到它的对应信息。
说到这里,我们需要注意一个问题,设备有很多属性列表,数据库也有很多字段属性列表,我们需要以一个为准,作为Sql语句字段列表的标准,否则就会出现问题。由于取本地Shape的属性虽然方便,但是由于其可能因为模具属性变化可能和数据库的字段列表不再一致,因此还是以数据库字段列表为准比较妥当。
为了获取某个表的字段列表信息,我们需要使用下面代码(该代码是我代码生成工具的基本函数来的,呵呵)
这里图纸的设备信息可以通过一个设备表如Device1来放置同一类型的设备信息,如负荷开关存放在Device1,架空线放在Device2等等,Device(n)是我们详细放置某种类型设备的表,其结构如下
另外主要我们再新建一个表来管理那种类型的设备对应那个表即可。如下图所示:
一旦建立了上表的关系,我们就知道那个类型的设备对应的表名是多少了。我们通过代码
List<DeviceTableInfo> deviceTables = deviceTableDAL.GetDeviceTables();
就可以获取到所有的设备类型表的信息了,这可以为我们下一步保存设备信息做准备。
为了获取到某个设备类型对应的表信息,我们可以这样拿到它的对应信息。
string deviceType = VisioUtility.GetShapeCellValue(shape,
"
设备类型
");
DeviceTableInfo tableInfo = deviceTableDAL.GetTableNameByDevice(deviceTables, deviceType);
我们知道,图纸有很多信息,我们遍历图纸设备的时候,可以通过遍历其选区实现,如下所示
DeviceTableInfo tableInfo = deviceTableDAL.GetTableNameByDevice(deviceTables, deviceType);
if (VisioUtility.HasShapeInWindow(visWindow))
{
visWindow.SelectAll();
foreach (Visio.Shape shape in visWindow.Selection)
{
}
visWindow.DeselectAll();
}
这样,我们有表的信息,又有了图纸设备遍历的方法,那我们就可以根据这些信息,生成保存每个设备的SQL语句了,你说是么?因为每个Shape有很多属性信息,我们把属性信息保存到数据库就可以了啊。
{
visWindow.SelectAll();
foreach (Visio.Shape shape in visWindow.Selection)
{
}
visWindow.DeselectAll();
}
说到这里,我们需要注意一个问题,设备有很多属性列表,数据库也有很多字段属性列表,我们需要以一个为准,作为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 = 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;
}
DataTable schemaTable = GetReaderSchema(tableName);
List< string> nameList = new List< string>();
foreach (DataRow dr in schemaTable.Rows)
{
nameList.Add(dr["ColumnName"].ToString());
}
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语句就实现设备的保存工作了。
if(! string.IsNullOrEmpty(value))
{
sqlValues += string.Format("'{0}',", value);
}
else
{
sqlValues += "NULL,";
}
本文转自博客园伍华聪的博客,原文链接:C#进行Visio二次开发之图纸设备信息的保存,如需转载请自行联系原博主。