1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/hgm1989-SqlToDocTool

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

1. Программное обеспечение

Сегодня я хочу поделиться с вами инструментом, который я создал для генерации документов с описанием структуры баз данных. Это удобно использовать при разработке, чтобы легко выгружать структуры таблиц бизнес-систем. Также этот инструмент можно использовать как часть документации проекта для описания дизайна баз данных. Это значительно экономит время на составление таких документов. Для желающих скачать или обсудить данный инструмент — добро пожаловать!

2. Технологическая архитектура

  • Программный язык: C# (.NET Framework 4.5.5)
  • Технология работы с базами данных: Dapper
  • Экспорт в Word: NPOI
  • Метод доступа: Windows Forms приложение, которое работает непосредственно на операционной системе Windows.

3. Описание функциональности

  • Поддержка типов данных: SQL Server, MySQL (версии 5.7 и 8.0), SQLite (обновляется постоянно)
  • Форматы экспорта: Word, HTML, Markdown
  • Контент экспорта: описание таблиц (подробности полей, комментарии, длина, значения по умолчанию и т.д.), скрипты создания таблиц, представления и скрипты представлений, хранилища процедур и скрипты
  • Открытие документа сразу после его создания
  • Резервное копирование баз данных (только для SQL Server)

4. Код программы

1. Код для получения информации о базах данных```java

///

/// Получение строки соединения с базой данных /// /// Имя сервера /// Идентификатор пользователя /// Пароль пользователя /// Название базы данных /// Порт /// Строка соединения public string GetConnectionString(string servername, string uid, string pwd, string db, string port) { return string.Format("server={0};uid={1};pwd={2};database={3}", servername, uid, pwd, db); } /// /// Получение списка баз данных /// /// Строка соединения /// Список названий баз данных public List GetDBNameList(string conStr) { string sql = "SELECT [name] FROM master.dbo.sysdatabases WHERE DBID > 6 ORDER BY [Name]"; try { using (SqlConnection connection = new SqlConnection(conStr)) { var list = connection.Query(sql).ToList(); return list; } } catch { return null; } }


        public List<DBModel> ПолучитьСписокБД(string conStr)
        {
            //List<DBName> list =new List<DBName>();
            string sql = "SELECT [name] FROM master.dbo.sysdatabases WHERE DBID > 6 ORDER BY [Name]";
            try
            {
                using (SqlConnection connection = new SqlConnection(conStr))
                {
                    var list = connection.Query<DBModel>(sql).ToList();
                    return list;
                }
            }
            catch
            {
                return null;
            }

        }
        /// <summary>
        /// Получает список таблиц в конкретной базе данных
        /// </summary>
        /// <param name="conStr"></param>
        /// <param name="dbName">Имя базы данных</param>
        /// <returns></returns>
```        public List<TableModel> ПолучитьСписокТаблиц(string conStr, string dbName = "")
        {
            var list = new List<TableModel>();
            //string sql = "SELECT TABLE_NAME as name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'";
            string sql = "select a.name AS tableName, CONVERT(NVARCHAR(100), ISNULL(g.[value], '')) AS tableDesc from sys.tables a left join sys.extended_properties g on (a.object_id = g.major_id AND g.minor_id = 0)";
            try
            {
                using (SqlConnection connection = new SqlConnection(conStr))
                {
                    list = connection.Query<TableModel>(sql).ToList();
                }
            }
            catch
            {```markdown
            }
            return список;
        }
        /// <summary>
        /// Получает список хранимых процедур в конкретной базе данных
        /// </summary>
        /// <param name="conStr"></param>
        /// <param name="dbName">Имя базы данных</param>
        /// <returns></returns>
        public List<ProcModel> ПолучитьСписокПроцедур(string conStr, string dbName = "")
        {
            var список = new List<ProcModel>();
            string sql = @"  select name as procName, (select text from syscomments where id=OBJECT_ID(name)) as proDetails
                            from dbo.sysobjects o where OBJECTPROPERTY(id, N'IsProcedure') = 1 order by name";
            try
            {
                using (SqlConnection connection = new SqlConnection(conStr))
                {
                    список = connection.Query<ProcModel>(sql).ToList();
                }
            }
            catch
            {
            }
        }
        /// <summary>
        /// Получение списка представлений из конкретной базы данных
        /// </summary>
        /// <param name="conStr">Строка подключения</param>
        /// <param name="dbName">Имя базы данных (необязательный параметр)</param>
        /// <returns>Список представлений</returns>
        public List<ViewModel> ПолучитьСписокПредставлений(string conStr, string dbName = "")
        {
            var список = new List<ViewModel>();
            string sql = @"  SELECT name AS viewName, (SELECT text FROM syscomments WHERE id = OBJECT_ID(name)) AS viewDetails
                            FROM dbo.sysobjects o WHERE OBJECTPROPERTY(id, N'IsView') = 1 ORDER BY name";
            try
            {
                using (SqlConnection connection = new SqlConnection(conStr))
                {
                    список = connection.Query<ViewModel>(sql).ToList();
                }
            }
            catch
            {
            }
        }
``````markdown
    }
     return список;
 }
 
 ```csharp        
         /// <summary>
         /// Получение информации о полях таблицы
         /// </summary>
         /// <param name="tableName"></param>
         /// <param name="conStr"></param>
         /// <returns></returns>
         public List<TableDetail> GetTableDetail(string tableName, string conStr, string dbName = "")
         {
             var list = new List<TableDetail>();
             StringBuilder sb = new StringBuilder();
             sb.Append("SELECT [index] = a.colorder, Title = a.name, isMark = CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity') = 1 THEN '1' ELSE '0' END, ");
             sb.Append("isPK = CASE WHEN EXISTS(SELECT 1 FROM sysobjects WHERE xtype = 'PK' AND parent_obj = a.id AND name IN(SELECT name FROM sysindexes WHERE indid IN(SELECT indid FROM sysindexkeys WHERE id = a.id AND colid = a.colid))) THEN '1' ELSE '0' END, ");
             sb.Append("FieldType = b.name, fieldLength = COLUMNPROPERTY(a.id, a.name, 'PRECISION'), isAllowEmpty = CASE WHEN a.isnullable = 1 THEN '1' ELSE '0' END, defaultValue = ISNULL(e.text, ''), fieldDesc = ISNULL(g.value, '') ");
             sb.Append("FROM syscolumns a LEFT JOIN systypes b ON a.xusertype = b.xusertype INNER JOIN sysobjects d ON a.id = d.id AND d	xtype = 'U' AND d.name <> 'dtproperties' LEFT JOIN syscomments e ON a.cdefault = e.id ");
             sb.Append("LEFT JOIN sys.extended_properties g ON a.id = g.major_id AND a.colid = g.minor_id LEFT JOIN sys.extended_properties f ON d.id = f.major_id AND f.minor_id = 0");
             // --Если требуется запросить информацию только для указанной таблицы, добавьте следующее условие where; tableName - имя таблицы, которую нужно запросить; удалите это условие, чтобы запросить информацию обо всех таблицах
             sb.Append("WHERE d.name = '" + tableName + "' ORDER BY a.id, a.colorder, d.name");
             try
             {
                 using (SqlConnection connection = new SqlConnection(conStr))
                 {
                     list = connection.Query<TableDetail>(sb.ToString()).ToList();
                 }
             }
             catch
             { }
         }
 
 ```java
 /// <summary>
         /// Создание html файла
```        /// </summary>
         /// <param name="list">Список таблиц модели</param>
         /// <param name="conStr">Строка подключения к базе данных</param>
         /// <param name="db">Имя базы данных</param>
         /// <param name="type">Тип создания HTML</param>
         public void CreateToHtml(List<TableModel> list, string conStr, string db, int type, List<string> checkList)
         {
             StringBuilder sb = new StringBuilder();
             sb.Append("<html><meta charset=\"utf-8\" /><meta http-equiv = \"Content-Language\" content = \"ru-RU\" >");
             sb.Append("<head><title>Документация по базе данных</title><body>");
             sb.Append("<style type=\"text/css\">\n");
             sb.Append("body { font-size: 9pt;}\n");
             sb.Append(".styledb { font-size: 14px; }\n");
             sb.Append(".styletab {font-size: 14px;padding-top: 15px; }\n</style></head><body>");
             sb.Append("<h1 style=\"text-align:center;\">Документация по базе данных " + db + "</h1>");```markdown
            GetDBService(type);

Так как данный фрагмент представляет собой вызов функции, он остается без изменений согласно правилам перевода.```markdown #region Создание таблицы if (checkList.Where(m => m.Equals("таблица")).Count() > 0) { sb.Append("

1. Структура таблиц

"); sb.Append(""); sb.Append(""); if (list.Count > 0) { foreach (var item in list) { if (item.tableDesc != null && item.tableDesc != "") { sb.Append("

Название таблицы: " + item.tableName + " (" + item.tableDesc + ")

"); } else { sb.Append("

Название таблицы: " + item.tableName + "

"); } sb.Append("<table cellspacing="0" cellpadding="5" border="1" width="100%" bordercolorlight="#4F7FC9" bordercolordark="#D3D8E0">"); sb.Append("<thead bgcolor="#E3EFFF">Порядковый номерИмя поляИдентификаторПервичный ключТип поляДлина поляРазрешение пустых значенийЗначение по умолчаниюПримечание к полю"); sb.Append(""); // начинаем с второй строки, так как первая — это заголовок int i = 1; var tabledetaillist = service.GetTableDetail(item.tableName, conStr, db);
                     if (tabledetaillist != null && tabledetaillist.Count > 0)
                     {
                         foreach (var itm in tabledetaillist)
                         {
                             sb.Append("<tr>");
                             sb.Append("<td>" + itm.index + "</td>");
                             sb.Append("<td>" + itm.Title + "</td>");
                             sb.Append("<td>" + itm.isMark + "</td>");
                             sb.Append("<td>" + itm.isPK + "</td>");
                             sb.Append("<td>" + itm.FieldType + "</td>");
                             sb.Append("<td>" + itm.Length + "</td>");
                             sb.Append("<td>" + itm.AllowNull + "</td>");
                             sb.Append("<td>" + itm.DefaultValue + "</td>");
                             sb.Append("<td>" + itm.Note + "</td>");
                             sb.Append("</tr>");
                         }
                     }
                     sb.Append("</tbody>");
                     sb.Append("</table>");
                 }
             }
         }
```markdown
Append("<td>" + itm.fieldLength + "</td>");
sb.Append("<td>" + itm.isAllowEmpty + "</td>");
sb.Append("<td>" + itm.defaultValue + "</td>");
sb.Append("<td>" + itm.fieldDesc + "</td>");
sb.Append("</tr>");
i++;

}
}

sb.Append("</tbody></table>");
``````markdown
# Создание таблиц

## Создание таблиц

```html
<h4>{{item.tableName}} создание таблицы</h4><br/>
<span>{{service.GetTableSQL(item.tableName, conStr)}}</span>

Хранимые процедуры

<h2>2. Хранимые процедуры</h2>
{% if proclist and proclist|length > 0 %}
    {% for item in proclist %}
        <h3>Название хранимой процедуры: {{item.procName}}</h3>
        <span>{{item.proDerails}}</span>
    {% endfor %}
{% endif %}

Представления

<h2>3. Представления</h2>
{% if viewlist and viewlist|length > 0 %}
    {% for item in viewlist %}
        <h3>Имя представления: {{item.viewName}}</h3>
        <span>{{item.viewDetails}}</span>
    {% endfor %}
{% endif %}

### Код программы

```csharp
foreach (var item in viewlist)
{
    sb.Append("<h3>Имя представления: " + item.viewName + "</h3>");
    sb.Append("<span>" + item.viewDetails + "</span>");
}
sb.ToString();
string filename = db + "-описание базы данных"; // имя файла
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.DefaultExt = "html";
saveDialog.Filter = "файлы html|*.html";
saveDialog.FileName = filename;
saveDialog.ShowDialog();
filename = saveDialog.FileName;
if (filename.IndexOf(":") < 0) return; // отменено
StreamWriter sw1 = new StreamWriter(saveDialog.FileName, false);
sw1.WriteLine(sb);
sw1.Close();
System.Diagnostics.Process.Start(filename);## 5. Эффект выполнения

Главное окно приложения

![Главное окно приложения](https://img-blog.csdnimg.cn/img_convert/89541a77ec170e554b86e063642347e0.png)

Поддержка трёх типов документов: можно выбрать только один, рекомендуется использовать формат Markdown

![Поддержка трёх типов документов](https://img-blog.csdnimg.cn/img_convert/02292df7f0e356a7a93a7c5a2f7ad22a.png)

Эффект создания документа Word

![Эффект создания документа Word](https://img-blog.csdnimg.cn/img_convert/aa6490b95dd6dc28811df5b61296d1f2.png)

Эффект создания документа HTML

![Эффект создания документа HTML](https://img-blog.csdnimg.cn/img_convert/4f35dadb8a53c93231fc33ce53ed95f7.png)

Эффект создания документа в формате Markdown

![Эффект создания документа в формате Markdown](https://img-blog.csdnimg.cn/img_convert/e46cee6009df27b253512ef8c4856246.png)

Резервное копирование базы данных SQL Server

![Резервное копирование базы данных SQL Server](https://img-blog.csdnimg.cn/img_convert/34d4e2cee49deadc6c96747bbb1e53eb.png)

## 6. Адрес открытого проекта

GitHub: <https://github.com/hgmsq/SqlToDocTool>

Gitee: <https://gitee.com/hgm1989/SqlToDocTool>

Gitcode: <https://gitcode.net/xishining/SqlToDocTool>

E-mail: hgmyz@outlook.com

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
AGPL-3.0
Отмена

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/hgm1989-SqlToDocTool.git
git@api.gitlife.ru:oschina-mirror/hgm1989-SqlToDocTool.git
oschina-mirror
hgm1989-SqlToDocTool
hgm1989-SqlToDocTool
master