MXQ_SQL_数据库辅助工具V1.2

V1.2版本 

1.2的源码暂时没发上来,过几天修改优化完在放上来,呵呵

直接看效果图

V1.0 版本

功能

1.快速设置数据字段说明

2.导出数据库文档 WORD文件

3.导出数据库字段说明SQL语句 文本文件

问题

打开导出WORD发现第二页的第一个表格 会和第一页末尾的表格叠加在一起,目前的办法不是最优的,不知道谁有好的建议,此问题将在下次更新时解决

V1.1 版本

增加可视化链接数据配置

快速生成 创建 添加 删除 修改 查询SQL语句

 

 

 

代码分享

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
using System.Threading;
using Microsoft.Office.Interop.Word;
using System.Xml;
using System.Reflection;
using System.IO;



namespace MXQ_SQLServer_Manager
{
    public partial class fm_mxq_sql_manager : Form
    {
        private string DataBasesName = "Master";//数据库
        private string TableName;               //数据表
        private string TableColumnName;         //数据列名
        private StringBuilder sqlStr;
        private bool connStringState = false;

        public fm_mxq_sql_manager()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            while (!connStringState)
            {
                try
                {
                    connStringState = true;
                    BeginInvoke((MethodInvoker)delegate()
                    {
                        Bind_DataBasesNameList();
                        Bind_DataTableNameList();
                    });
                }
                catch
                {
                    connStringState = false;
                    tmLoadEvent.Start();
                }
            }
        }

        //绑定数据库名称列表
        private void Bind_DataBasesNameList()
        {
            try
            {

                cboDataBaseName.Text = "";
                cboDataBaseName.Items.Clear();
                sqlStr = new StringBuilder();
                sqlStr.Append(" USE [Master] ");
                sqlStr.Append(" SELECT DBID,NAME,CRDATE,FILENAME ");
                sqlStr.Append(" FROM SYSDATABASES WHERE name NOT IN('master','tempdb','model','msdb','ReportServer','ReportServerTempDB')  ");
                sqlStr.Append(" ORDER BY NAME ");
                DataSet dataBasesLists = SqlHelper.ExecuteDataTable(SqlHelper.ConnectionStringLocalTransaction
                    , CommandType.Text, sqlStr.ToString(), null);
                foreach (DataRow dt_dr in dataBasesLists.Tables[0].Rows)
                {
                    cboDataBaseName.Items.Add(dt_dr["NAME"]);
                }
                DataBasesName = cboDataBaseName.Items[0].ToString();
            }
            catch
            {
                return;
            }
        }

        //绑定数据表名称列表
        private void Bind_DataTableNameList()
        {

            try
            {
                DataBasesName = cboDataBaseName.SelectedItem != null ? cboDataBaseName.SelectedItem.ToString()
                    : cboDataBaseName.Items[0].ToString();
                cboTableNames.Text = "";
                cboTableNames.Items.Clear();
                sqlStr = new StringBuilder();
                sqlStr.Append(" USE [" + DataBasesName + "] ");
                sqlStr.Append(" SELECT object_id,name,create_date,modify_date,type,type_desc  ");
                sqlStr.Append(" FROM sys.tables ");
                sqlStr.Append(" ORDER BY name ");

                DataSet dataTableLists = SqlHelper.ExecuteDataTable(SqlHelper.ConnectionStringLocalTransaction
                    , CommandType.Text, sqlStr.ToString(), null);
                foreach (DataRow dt_dr in dataTableLists.Tables[0].Rows)
                {
                    cboTableNames.Items.Add(dt_dr["name"]);
                }
                TableName = cboTableNames.Items[0].ToString();
            }
            catch
            {
                return;
                // throw;
            }
        }

        //绑定数据表结构信息
        private void Bind_TableInfo()
        {
            dgvTableInfo.DataSource = null;
            TableName = cboTableNames.SelectedItem != null ? cboTableNames.SelectedItem.ToString() : cboTableNames.Items[0].ToString();
            dgvTableInfo.DataSource = GetDataTableInfo(TableName);
        }

        private DataTable GetDataTableInfo(string dataTableName)
        {

            sqlStr = new StringBuilder();
            sqlStr.Append(" USE [" + DataBasesName + "] ");
            sqlStr.Append(" declare @objname nvarchar(800), @objid int , @sysobj_type char(2), @dbname    sysname,@no varchar(35), ");
            sqlStr.Append("         @yes varchar(35), @none varchar(35), @precscaletypes nvarchar(150),@colname sysname ");
            sqlStr.Append(" set @objname='" + dataTableName + "' ");
            sqlStr.Append(" select @objid = object_id, @sysobj_type = type from sys.all_objects where object_id = object_id(@objname) ");
            sqlStr.Append(" select @no = '', @yes = '√', @none = 'none' ");
            sqlStr.Append(" select @precscaletypes =  ");
            sqlStr.Append(" N'tinyint,smallint,decimal,int,real,money,float,numeric,smallmoney,date,time,datetime2,datetimeoffset,' ");
            sqlStr.Append(" select ");
            sqlStr.Append(" '序号'                =column_id, ");
            sqlStr.Append(" '列名'                = name, ");
            sqlStr.Append(" '类型'                    = type_name(user_type_id), ");
            sqlStr.Append(" '长度'                    = convert(int, max_length), ");
            sqlStr.Append(" '精度'                    = case when charindex(type_name(system_type_id) + ',', @precscaletypes) > 0 ");
            sqlStr.Append(" then convert(char(5),ColumnProperty(object_id, name, 'precision')) ");
            sqlStr.Append(" else '     ' end, ");
            sqlStr.Append(" '小数'                    = case when charindex(type_name(system_type_id) + ',', @precscaletypes) > 0 ");
            sqlStr.Append(" then convert(char(5),OdbcScale(system_type_id,scale)) ");
            sqlStr.Append(" else '     ' end, ");
            sqlStr.Append(" '说明'=ISNULL((SELECT TOP 1 PFD.value FROM  sys.extended_properties PFD WHERE PFD.class=1  ");
            sqlStr.Append("  AND PFD.major_id=@objid  AND PFD.minor_id=column_id),N'') , ");
            sqlStr.Append(" '允许NULL值'                = case when is_nullable = 0 then @no else @yes end, ");
            sqlStr.Append(" '标识列'=case when (select col_name(@objid, column_id) ");
            sqlStr.Append("  from sys.identity_columns where object_id=@objid)=name then @yes else @no end  ");
            sqlStr.Append(" from sys.all_columns AS AC where object_id =@objid ");
            DataSet dataTableInfo = SqlHelper.ExecuteDataTable(SqlHelper.ConnectionStringLocalTransaction
                , CommandType.Text, sqlStr.ToString(), null);
            return dataTableInfo.Tables[0];
        }

        //数据库选中项改变
        private void cboDataBaseName_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboDataBaseName.SelectedIndex != -1)
            {
                Bind_DataTableNameList();
            }
            dgvTableInfo.DataSource = null;
        }

        //数据表选中项改变
        private void cboTableNames_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboTableNames.SelectedIndex != -1)
            {
                Bind_TableInfo();
            }
        }

        //添加或修改数据表字段说明
        private void addDataColumnDescription()
        {
            try
            {
                sqlStr = new StringBuilder();
                sqlStr.Append(" USE [" + DataBasesName + "] ");
                sqlStr.Append(" EXEC sys.sp_addextendedproperty @name=N'MS_Description',  ");
                sqlStr.Append(" @value=@DataColumnDescription, @level0type=N'SCHEMA', ");
                sqlStr.Append(" @level0name=N'dbo',@level1type=N'TABLE',@level1name=N'" + TableName + "', ");
                sqlStr.Append(" @level2type=N'COLUMN',@level2name=N'" + TableColumnName + "' ");
                SqlParameter[] sp = new SqlParameter[] {
                    new  SqlParameter("@DataColumnDescription",txtDataColumnDescription.Text.Trim()),
                };
                SqlHelper.ExecuteNonQuery(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, sqlStr.ToString(), sp);
            }
            catch
            {
                sqlStr = new StringBuilder();
                sqlStr.Append(" USE [" + DataBasesName + "] ");
                sqlStr.Append(" DECLARE @v sql_variant  ");
                sqlStr.Append(" SET @v=@DataColumnDescription ");
                sqlStr.Append(" EXECUTE sp_updateextendedproperty N'MS_Description', @v, N'SCHEMA', ");
                sqlStr.Append(" N'dbo', N'TABLE', N'" + TableName + "', N'COLUMN', N'" + TableColumnName + "' ");
                SqlParameter[] sp = new SqlParameter[] {
                    new  SqlParameter("@DataColumnDescription",txtDataColumnDescription.Text.Trim()),
                };
                SqlHelper.ExecuteNonQuery(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, sqlStr.ToString(), sp);
                //throw;
            }
            Bind_TableInfo();
        }

        //dgv改变选中单元格
        private void dgvTableInfo_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                txtDataColumnDescription.Text = dgvTableInfo.Rows[e.RowIndex].Cells["说明"].Value.ToString();
            }
        }

        //文本框失去焦点
        private void txtDataColumnDescription_Leave(object sender, EventArgs e)
        {
            addDataColumnDescription();
        }

        private void dgvTableInfo_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                TableColumnName = dgvTableInfo.Rows[e.RowIndex].Cells["列名"].Value.ToString();
                txtDataColumnDescription.Text = dgvTableInfo.Rows[e.RowIndex].Cells["说明"].Value.ToString();
            }
        }

        private void btn_isTop_Click(object sender, EventArgs e)
        {
            if (this.btn_isTop.Text == "")
            {
                this.TopMost = false;
                btn_isTop.Text = "";
            }
            else
            {
                this.TopMost = true;
                btn_isTop.Text = "";
            }
        }

        private void tsmi_ShowMain_Click(object sender, EventArgs e)
        {
            this.TopMost = true;
            this.WindowState = System.Windows.Forms.FormWindowState.Normal;
            this.TopMost = false;
        }

        private void tsmi_exit_Click(object sender, EventArgs e)
        {
            System.Windows.Forms.Application.Exit();
        }

        private void tsmi_start_Click(object sender, EventArgs e)
        {
            SetAutoRun("MXQ_SQLServer_Manager", "\"" + System.Windows.Forms.Application.StartupPath + "\\MXQ_SQLServer_Manager.exe\" /start");
        }

        #region 开机自动启动
        /// <summary>
        ///开机自动启动
        /// </summary>
        /// <param name="keyName">注册表key.</param>
        /// <param name="filePath">软件路径</param>
        /// <returns>返回:Boolean 类型</returns>
        public static bool SetAutoRun(string ShortFileName, string filePath)
        {
            try
            {
                //打开子键节点
                RegistryKey MyReg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
                if (MyReg == null)
                {//如果子键节点不存在,则创建之
                    MyReg = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
                }
                //在注册表中设置自启动程序
                MyReg.SetValue(ShortFileName, filePath);
                MyReg.Close();
            }
            catch
            {
                return false;
            }
            return true;
        }
    #endregion

        private void btnImportOut_Click(object sender, EventArgs e)
        {

            #region 导出数据库说明到Word
            if (rdoDataBaseDescription.Checked)
            {
                string[] tableColumnNames = new string[] { "序号", "列名", "类型", "长度" , "精度" ,
                                                        "小数", "说明", "允许NULL值", "标识列" };
                string fileName = "数据库 " + DataBasesName + DateTime.Now.ToString("yyyy年MM月dd日hhmms");
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.AddExtension = true;
                sfd.RestoreDirectory = true;
                sfd.FileName = fileName;
                sfd.DefaultExt = ".doc";
                sfd.Filter = "word文档|*.doc|所有文件|*.*";
                sfd.Title = "导出数据库说明文档";
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcessesByName("WINWORD"))
                    {
                        p.Kill();
                    }
                    string filePatch = sfd.FileName;
                    //创建Word文档
                    Object Nothing = Missing.Value;
                    Microsoft.Office.Interop.Word.Application WordApp = new Microsoft.Office.Interop.Word.Application();
                    Microsoft.Office.Interop.Word.Document WordDoc = WordApp.Documents.Add(ref Nothing, ref Nothing, ref Nothing, ref Nothing);
                    WordApp.Selection.ParagraphFormat.LineSpacing = 3f;//设置文档的行间距
                    //文档中创建表格
                    foreach (var objItem in cboTableNames.Items)
                    {
                        DataTable dt = GetDataTableInfo(objItem.ToString());
                        object count = 20;
                        object WdLine = WdUnits.wdLine;//换一行;
                        WordApp.Selection.MoveDown(ref WdLine, ref count, ref Nothing);//移动焦点
                        WordApp.Selection.TypeParagraph();//插入段落
                        Microsoft.Office.Interop.Word.Table newTable = WordDoc.Tables.Add(WordApp.Selection.Range, dt.Rows.Count + 1, 9, ref Nothing, ref Nothing);
                        //设置表格样式
                        WordDoc.Content.Font.Size = 10;
                        newTable.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleDouble;
                        newTable.Borders.InsideLineStyle = WdLineStyle.wdLineStyleSingle;
                        newTable.Columns[1].Width = 40f;
                        newTable.Columns[2].Width = 100f;
                        newTable.Columns[3].Width = 60f;
                        newTable.Columns[4].Width = 40f;
                        newTable.Columns[5].Width = 40f;
                        newTable.Columns[6].Width = 40f;
                        newTable.Columns[7].Width = 80f;
                        newTable.Columns[8].Width = 40f;
                        newTable.Columns[9].Width = 40f;

                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            for (int j = 0; j < 9; j++)
                            {
                                if (i < 3)
                                {
                                    newTable.Cell(1, 1).Range.Text = "表名:" + objItem.ToString();
                                    newTable.Cell(2, j + 1).Range.Text = tableColumnNames[j];
                                }
                                newTable.Cell(i + 3, j + 1).Range.Text = dt.Rows[i][j].ToString();
                            }
                        }
                        newTable.Cell(1, 1).Merge(newTable.Cell(1, 9));

                        try
                        {
                            //文件保存
                            WordDoc.SaveAs(filePatch);
                            MessageBox.Show("创建成功! " + filePatch);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("异常错误" + ex.Message.ToString());
                        }
                        finally
                        {
                            WordDoc.Close();
                            WordApp.Quit();
                        }

                    }
                }
            }
            #endregion

            #region 导出数据库字段说明SQL语句
            if (rdoDataBasesDescriptionAdd.Checked)
            {
                string fileName = "数据库 " + DataBasesName + "说明SQL语句" + DateTime.Now.ToString("yyyy年MM月dd日hhmmss");
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.AddExtension = true;
                sfd.RestoreDirectory = true;
                sfd.FileName = fileName;
                sfd.DefaultExt = ".txt";
                sfd.Filter = "文本文档|*.txt|所有文件|*.*";
                sfd.Title = "导出数据库说明SQL语句";
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        if (Directory.Exists(sfd.FileName))
                        {
                            Directory.CreateDirectory(sfd.FileName);
                        }
                        StringBuilder dtsql = new StringBuilder();
                        foreach (var objItem in cboTableNames.Items)
                        {
                            DataTable dtSql = GetDataTableInfo(objItem.ToString());
                            foreach (DataRow dt_dr in dtSql.Rows)
                            {
                                if (dt_dr["说明"].ToString() != "")
                                {
                                    dtsql.Append(" USE [" + DataBasesName + "] ");
                                    dtsql.Append(" EXEC sys.sp_addextendedproperty @name=N'MS_Description',  ");
                                    dtsql.Append(" @value=N'" + dt_dr["说明"] + "', @level0type=N'SCHEMA', ");
                                    dtsql.Append(" @level0name=N'dbo',@level1type=N'TABLE',@level1name=N'" + objItem.ToString() + "', ");
                                    dtsql.Append(" @level2type=N'COLUMN',@level2name=N'" + dt_dr["列名"] + "' ");
                                    dtsql.Append(" \r\n ");
                                }
                            }
                        }
                        using (StreamWriter sw = new StreamWriter(sfd.FileName, false))
                        {
                            sw.Write(dtsql);
                            sw.Flush();
                            sw.Close();
                        }
                        MessageBox.Show("创建成功! " + sfd.FileName);
                    }
                    catch (Exception)
                    {
                        
                        throw;
                    }
                }
            }
            #endregion
        }
    }
}

 

 

 

 

 

posted @ 2012-04-30 22:21  MengXQ  阅读(1669)  评论(2编辑  收藏  举报
W3School 在线教程