示例#1
0
        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
                    {
                        // 最后关闭文件,无视 关闭是否会发生错误了.
                    }
                }
            }
        }