以下代码是读取xml的内容,包括列字段信息和表数据.采用线程读取各个表的数据.针对特定的XML格式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
private string fileName; private XmlTextWriter writer; ////// 数据库类型 /// private DataBaseType dataBaseType; ////// 表名 /// private DataTable tableNames = new DataTable(); private DictionarytableSchemas = new Dictionary (); private Dictionary tableDatas = new Dictionary (); private Dictionary tableSQLs = new Dictionary (); private Dictionary tableColInfos = new Dictionary (); /// /// 读取数据时必须先调用 LoadOffLineData() /// 写数据时必须先调用 InitXmlTextWriter() /// /// public FileHelper(string fileName) { this.fileName = fileName; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
////// 根据类型名称获取对应的类型 /// /// ///private Type GetType(string typeName) { Type type = typeof(Object); typeName = typeName.ToLower().Trim(); switch (dataBaseType) { case DataBaseType.Access: break; case DataBaseType.DB2: break; case DataBaseType.MySql: break; case DataBaseType.Odbc: break; case DataBaseType.Oracle: break; case DataBaseType.SqlCe: break; case DataBaseType.SqlServer: switch (typeName) { case "int": case "smallint": case "bigint": type = typeof(int); break; case "bit": type = typeof(Boolean); break; case "datetime": case "smalldatetime": type = typeof(DateTime); break; case "decimal": case "numeric": case "smallmoney": type = typeof(Decimal); break; case "float": type = typeof(Double); break; case "image": case "money": case "binary": case "sql_variant": case "timestamp": case "varbinary": case "uniqueidentifier": case "xml": type = typeof(Object); break; case "ntext": case "varchar": case "nvarchar": case "text": case "nchar": case "char": type = typeof(String); break; case "real": type = typeof(Single); break; case "tinyint": type = typeof(Byte); break; } break; } return type; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
////// 加载离线数据 /// ///public bool LoadOffLineData() { XmlTextReader reader = new XmlTextReader(fileName); tableNames.Columns.Add("name"); if (reader.ReadToFollowing("database")) { try { dataBaseType = (DataBaseType)Enum.Parse(typeof(DataBaseType), reader.GetAttribute("databasetype")); while (reader.ReadToFollowing("table")) { tableNames.Rows.Add(reader.GetAttribute("name")); Thread th = new Thread(AnalyzeTableXml); th.Start(reader.ReadOuterXml()); } } catch (Exception err) { dataBaseType = DataBaseType.SqlServer; this.LogWrite(LogType.Error, "加载离线数据出错!", err); return false; } } reader.Close(); return true; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
////// 分析表结构与读取表数据 /// /// private void AnalyzeTableXml(object obj) { string tableName = ""; try { XmlTextReader reader = new XmlTextReader(obj.ToString(), XmlNodeType.Document, null); if (reader.ReadToFollowing("table")) { //作为Key值,表名全为小写 tableName = reader.GetAttribute("name").Trim().ToLower(); DataTable dtSchema = new DataTable(); DataTable dtColInfo = new DataTable(); DataTable dataDt = new DataTable(); dtSchema.TableName = tableName; dtColInfo.TableName = tableName; dataDt.TableName = tableName; tableSchemas.Add(tableName, dtSchema); tableColInfos.Add(tableName, dtColInfo); tableDatas.Add(tableName, dataDt); //读取建表语句 if (reader.ReadToDescendant("createsql") && !reader.IsEmptyElement) { tableSQLs.Add(tableName, reader.ReadElementString().Trim()); } else { this.LogWrite(LogType.Info, "表[{0}]没有建表语句!".Formats(tableName)); } //读取列(结构) if (reader.ReadToNextSibling("columns") && !reader.IsEmptyElement) { //第一列 if (reader.ReadToDescendant("column")) { AddColumn(reader, dtSchema); AddColInfo(reader, dtColInfo); dataDt.Columns.Add(reader.GetAttribute("col_name"));//添加列 //循环读取其它列 while (reader.ReadToNextSibling("column")) { AddColumn(reader, dtSchema); AddColInfo(reader, dtColInfo); dataDt.Columns.Add(reader.GetAttribute("col_name"));//添加列 } } } else { this.LogWrite(LogType.Info, "表[{0}]没有结构信息!".Formats(tableName)); return; } //读取行(数据) if (reader.ReadToNextSibling("rows") && !reader.IsEmptyElement) { //第一行 if (reader.ReadToDescendant("row") && !reader.IsEmptyElement) { do { //第一单元格 if (reader.ReadToDescendant("cell")) { DataRow dr = dataDt.Rows.Add(); dr[reader.GetAttribute("columnname")] = reader.ReadElementString().Trim(); //循环读取其它单元格 while (reader.ReadToNextSibling("cell")) { dr[reader.GetAttribute("columnname")] = reader.ReadElementString().Trim(); } } } while (reader.ReadToNextSibling("row") && !reader.IsEmptyElement); } } } reader.Close(); } catch (Exception err) { this.LogWrite(LogType.Error, "分析表[{0}]XML出错!".Formats(tableName), err); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
////// 添加列 /// /// /// private void AddColumn(XmlTextReader reader, DataTable dtSchema) { DataColumn dc = dtSchema.Columns.Add(reader.GetAttribute("col_name")); dc.DataType = GetType(reader.GetAttribute("col_typename")); dc.AllowDBNull = bool.Parse(reader.GetAttribute("col_null")); dc.AutoIncrement = bool.Parse(reader.GetAttribute("col_identity") == "" ? "false" : reader.GetAttribute("col_identity")); if (dc.AutoIncrement) { dc.AutoIncrementSeed = long.Parse(reader.GetAttribute("col_seed") == "" ? "0" : reader.GetAttribute("col_seed")); dc.AutoIncrementStep = long.Parse(reader.GetAttribute("col_increment") == "" ? "0" : reader.GetAttribute("col_increment")); } if (dc.DataType == typeof(string)) { dc.MaxLength = Int32.Parse(reader.GetAttribute("col_len") == "" ? Int64.MaxValue.ToString() : reader.GetAttribute("col_len")); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
////// 添加列的行信息 /// /// /// private void AddColInfo(XmlTextReader reader, DataTable dtColInfo) { DataRow dr = dtColInfo.Rows.Add(); for (int i = 0; i < reader.AttributeCount; i++) { reader.MoveToAttribute(i); if (!dtColInfo.Columns.Contains(reader.Name)) { dtColInfo.Columns.Add(reader.Name); } dr[reader.Name] = reader.Value; } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
CREATE TABLE [dbo].[IncidentTemplate]( [ID] [int] IDENTITY(1, 1) NOT NULL, [alarmtype] [int] NULL, [content] [nvarchar](2000) NULL, CONSTRAINT [PK_INCIDENTTEMPLATE] PRIMARY KEY CLUSTERED([ID]))EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'案件模板' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'IncidentTemplate'EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'序号' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'IncidentTemplate', @level2type=N'COLUMN', @level2name=N'ID'EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'案件性质' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'IncidentTemplate', @level2type=N'COLUMN', @level2name=N'alarmtype'EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'模板内容' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'IncidentTemplate', @level2type=N'COLUMN', @level2name=N'content' |
54 | 151 | | |
55 | 160 | | |
56 | 155 | | |
57 | 158 | | |
62 | 131 | | |
63 | 149 | | |
64 | 174 | |