public void ReadAllTableAndViewInfoTest() { OracleDatabaseInfoReader target = new OracleDatabaseInfoReader(); string connString = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.102)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)));User Id=TEST;Password=TEST"; List <TableOrViewInfo> tableInfoList = target.ReadAllTableAndViewInfo(connString); // 查询目标数据库, 结果列表应该非空. Assert.IsNotNull(tableInfoList); TableOrViewInfo testMainTableInfo = tableInfoList.FirstOrDefault(p => p.Name == "TEST_MAIN"); // 结果列表应该 包含有 TEST_MAIN 表的信息. Assert.IsNotNull(testMainTableInfo); // 备注信息 应该与 数据库中像匹配. Assert.AreEqual("测试主表", testMainTableInfo.Comment); TableOrViewInfo testSubTableInfo = tableInfoList.FirstOrDefault(p => p.Name == "TEST_SUB"); // 结果列表应该 包含有 TEST_SUB 表的信息. Assert.IsNotNull(testSubTableInfo); // 备注信息 应该与 数据库中像匹配. Assert.AreEqual("测试子表", testSubTableInfo.Comment); // 结果列表应该 包含有 TEST_MAIN 表 中具体每一列 的信息. // 列的 List 应该非空. Assert.IsNotNull(testMainTableInfo.ColumnList); // TEST_MAIN 表 只有2列. Assert.AreEqual(2, testMainTableInfo.ColumnList.Count); ColumnInfo testMainId = testMainTableInfo.ColumnList.FirstOrDefault(p => p.Name == "ID"); // 应该能够检索到 TEST_MAIN 表的 ID 列. Assert.IsNotNull(testMainId); // 列的备注信息应该与数据库一致. Assert.AreEqual("测试主表编号", testMainId.Comment); ColumnInfo testMainValue = testMainTableInfo.ColumnList.FirstOrDefault(p => p.Name == "VALUE"); // 应该能够检索到 TEST_MAIN 表的 VALUE 列. Assert.IsNotNull(testMainValue); // 列的备注信息应该与数据库一致. Assert.AreEqual("测试主表数值", testMainValue.Comment); }
public List <TableOrViewInfo> ReadAllTableAndViewInfo(string connString) { // 预期结果. List <TableOrViewInfo> resultList = new List <TableOrViewInfo>(); // 建立数据库连接. SqlConnection conn = new SqlConnection(connString); // 创建DataSet,用于存储数据. DataSet resultDataSet = new DataSet(); // 创建一个适配器 SqlDataAdapter tableAdapter = new SqlDataAdapter(READ_TABLE_INFO_SQL, conn); // 执行查询,并将数据导入DataSet. tableAdapter.Fill(resultDataSet, "TableInfo"); // 创建一个适配器 SqlDataAdapter tableColumnAdapter = new SqlDataAdapter(READ_TABLE_COLUMN_INFO_SQL, conn); // 执行查询,并将数据导入DataSet. tableColumnAdapter.Fill(resultDataSet, "TableColumnInfo"); // 创建一个适配器 SqlDataAdapter viewAdapter = new SqlDataAdapter(READ_VIEW_INFO_SQL, conn); // 执行查询,并将数据导入DataSet. viewAdapter.Fill(resultDataSet, "ViewInfo"); // 创建一个适配器 SqlDataAdapter viewColumnAdapter = new SqlDataAdapter(READ_VIEW_COLUMN_INFO_SQL, conn); // 执行查询,并将数据导入DataSet. viewColumnAdapter.Fill(resultDataSet, "ViewColumnInfo"); #region 先加表. foreach (DataRow tableRow in resultDataSet.Tables["TableInfo"].Rows) { // 依次处理每一个表. TableOrViewInfo tableInfo = new TableOrViewInfo(); // 表. tableInfo.IsView = false; // 表名. tableInfo.Name = tableRow["TableName"].ToString(); // 备注. tableInfo.Comment = tableRow["Comment"].ToString(); // 列. tableInfo.ColumnList = new List <ColumnInfo>(); // 检索当前表的列. DataRow[] rows = resultDataSet.Tables["TableColumnInfo"].Select("TableName='" + tableInfo.Name + "'", "ColumnId"); for (int i = 0; i < rows.Length; i++) { DataRow row = rows[i]; // 读取每一列. ColumnInfo columnInfo = new ColumnInfo(); // 列名 columnInfo.Name = row["ColumnName"].ToString(); //// 列的顺序 //columnInfo.ColumnId = Convert.ToInt32(row["ColumnId"]); //// 数据类型 //columnInfo.DataType = row["DataType"].ToString(); //// 占用字节数 //columnInfo.MaxLength = Convert.ToInt32(row["MaxLength"]); //// 长度 //columnInfo.Precision = Convert.ToInt32(row["Precision"]); //// 小数位数 //columnInfo.Scale = Convert.ToInt32(row["Scale"]); //// 是否允许非空 //columnInfo.IsNullAble = Convert.ToInt32(row["IsNullAble"]) == 1; //// 是否是自增ID //columnInfo.IsIDEntity = Convert.ToInt32(row["IsIDEntity"]) == 1; //// 是否是主键 //columnInfo.IsPrimaryKey = Convert.ToInt32(row["IsPrimaryKey"]) == 1; // 备注/说明信息 columnInfo.Comment = row["Comment"].ToString(); // 列加入表的列List. tableInfo.ColumnList.Add(columnInfo); } // 处理完毕后,表加入结果列表. resultList.Add(tableInfo); } #endregion #region 后处理视图. foreach (DataRow viewRow in resultDataSet.Tables["ViewInfo"].Rows) { // 依次处理每一个视图. TableOrViewInfo viewInfo = new TableOrViewInfo(); // 视图. viewInfo.IsView = true; // 视图名. viewInfo.Name = viewRow["ViewName"].ToString(); // 备注. viewInfo.Comment = viewRow["Comment"].ToString(); // 列. viewInfo.ColumnList = new List <ColumnInfo>(); // 检索当前表的列. DataRow[] rows = resultDataSet.Tables["ViewColumnInfo"].Select("ViewName='" + viewInfo.Name + "'", "ColumnId"); for (int i = 0; i < rows.Length; i++) { DataRow row = rows[i]; // 读取每一列. ColumnInfo columnInfo = new ColumnInfo(); // 列名 columnInfo.Name = row["ColumnName"].ToString(); //// 列的顺序 //columnInfo.ColumnId = Convert.ToInt32(row["ColumnId"]); //// 数据类型 //columnInfo.DataType = row["DataType"].ToString(); //// 占用字节数 //columnInfo.MaxLength = Convert.ToInt32(row["MaxLength"]); //// 长度 //columnInfo.Precision = Convert.ToInt32(row["Precision"]); //// 小数位数 //columnInfo.Scale = Convert.ToInt32(row["Scale"]); //// 是否允许非空 //columnInfo.IsNullAble = Convert.ToInt32(row["IsNullAble"]) == 1; //// 是否是自增ID //columnInfo.IsIDEntity = Convert.ToInt32(row["IsIDEntity"]) == 1; //// 是否是主键 //columnInfo.IsPrimaryKey = Convert.ToInt32(row["IsPrimaryKey"]) == 1; // 备注/说明信息 columnInfo.Comment = row["Comment"].ToString(); // 列加入 视图的列List. viewInfo.ColumnList.Add(columnInfo); } // 处理完毕后,加入结果列表. resultList.Add(viewInfo); } #endregion return(resultList); }
public List <TableOrViewInfo> ReadAllTableAndViewInfo(string connString) { // 预期结果. List <TableOrViewInfo> resultList = new List <TableOrViewInfo>(); using (OracleConnection conn = new OracleConnection(connString)) { // 创建DataSet,用于存储数据. DataSet resultDataSet = new DataSet(); // 创建一个适配器 OracleDataAdapter tableAdapter = new OracleDataAdapter(READ_TABLE_INFO_SQL, conn); // 执行查询,并将数据导入DataSet. tableAdapter.Fill(resultDataSet, "TableInfo"); // 创建一个适配器 OracleDataAdapter tableColumnAdapter = new OracleDataAdapter(READ_TABLE_COLUMN_INFO_SQL, conn); // 执行查询,并将数据导入DataSet. tableColumnAdapter.Fill(resultDataSet, "TableColumnInfo"); #region 先加表. foreach (DataRow tableRow in resultDataSet.Tables["TableInfo"].Rows) { // 依次处理每一个表. TableOrViewInfo tableInfo = new TableOrViewInfo(); // 表. tableInfo.IsView = false; // 表名. tableInfo.Name = tableRow["TABLE_NAME"].ToString(); // 备注. tableInfo.Comment = tableRow["COMMENTS"].ToString(); // 列. tableInfo.ColumnList = new List <ColumnInfo>(); // 检索当前表的列. DataRow[] rows = resultDataSet.Tables["TableColumnInfo"].Select("TABLE_NAME='" + tableInfo.Name + "'"); for (int i = 0; i < rows.Length; i++) { DataRow row = rows[i]; // 读取每一列. ColumnInfo columnInfo = new ColumnInfo(); // 列名 columnInfo.Name = row["COLUMN_NAME"].ToString(); // 备注/说明信息 columnInfo.Comment = row["COMMENTS"].ToString(); // 列加入表的列List. tableInfo.ColumnList.Add(columnInfo); } // 处理完毕后,表加入结果列表. resultList.Add(tableInfo); } #endregion } return(resultList); }
/// <summary> /// 写入文件. /// </summary> /// <param name="edmxLineList"></param> /// <param name="tableInfoList"></param> private void WriteEdmx(string edmxFileName, List <string> edmxLineList, List <TableOrViewInfo> tableInfoList) { StreamWriter sw = null; try { // 首先判断,文件是否已经存在 if (File.Exists(edmxFileName)) { // 如果文件已经存在,那么删除掉. File.Delete(edmxFileName); } // 如果该文件存在,并且 append 为 false,则该文件被覆盖。 sw = new StreamWriter(edmxFileName, false, Encoding.UTF8); // 处理标志: // 0 :未进入处理阶段 // 1 : 进入到处理阶段. // 2 : 离开处理阶段. int processFlag = 0; // 表信息. TableOrViewInfo tabInfo = null; for (int i = 0; i < edmxLineList.Count; i++) { if (edmxLineList[i].Contains(StartMark)) { // 进入到处理阶段. processFlag = 1; } else if (edmxLineList[i].Contains(StartMark)) { // 离开处理阶段. processFlag = 2; } if (processFlag == 0 || processFlag == 2) { // 原始方式写入. sw.WriteLine(edmxLineList[i]); } else if (processFlag == 1) { // 仅仅在 处理阶段 以内,才做处理. if (edmxLineList[i].Contains("<EntityType Name=")) { // 原始方式写入. sw.WriteLine(edmxLineList[i]); // 可能需要做 处理了. string tableName = edmxLineList[i].Replace("<EntityType Name=", ""); tableName = tableName.Replace('>', ' '); tableName = tableName.Replace('\"', ' '); tableName = tableName.Trim(); // 检索表信息. tabInfo = tableInfoList.FirstOrDefault(p => p.Name == tableName); if (tabInfo != null) { // 追加 表的 备注信息. sw.WriteLine(" <Documentation>"); sw.WriteLine(" <Summary>{0}</Summary>", tabInfo.Comment); sw.WriteLine(" </Documentation>"); } } else if (edmxLineList[i].Contains("<Property ")) { string line = edmxLineList[i]; line = line.Replace("/", ""); // 不关闭方式写入 sw.WriteLine(line); line = line.Replace("<", ""); line = line.Replace(">", ""); line = line.Trim(); // 可能需要做 处理了. string[] tmpArray = line.Split(DivCharArray); string columnName = tmpArray.FirstOrDefault(p => p.Contains("Name=")); columnName = columnName.Replace("\"", ""); columnName = columnName.Substring(5); if (tabInfo != null && tabInfo.ColumnList != null) { ColumnInfo colInfo = tabInfo.ColumnList.FirstOrDefault(p => p.Name == columnName); if (colInfo != null) { // 追加 列的 备注信息. sw.WriteLine(" <Documentation>"); sw.WriteLine(" <Summary>{0}</Summary>", colInfo.Comment); sw.WriteLine(" </Documentation>"); } } // 关闭写入 sw.WriteLine(" </Property>"); } else { // 其他情况 // 原始方式写入. sw.WriteLine(edmxLineList[i]); } } } // 关闭文件. sw.Close(); sw = null; } catch (Exception ex) { Console.WriteLine("在写入文件的过程中,发生了异常!"); Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } finally { if (sw != null) { try { sw.Close(); } catch { // 最后关闭文件,无视 关闭是否会发生错误了. } } } }