DUICUO

オープンソースプロジェクト: データベーステーブル構造生成ツール

I. ソフトウェアの紹介

本日は、私が開発したデータベーステーブル構造ドキュメントジェネレーターをご紹介します。開発中の業務システムのテーブル構造を簡単にエクスポートできるだけでなく、プロジェクト受入書類におけるデータベース設計ドキュメントとしても活用できます。これにより、データベーステーブル構造ドキュメントの作成時間を大幅に短縮できます。ぜひダウンロードして、お気軽にお問い合わせください。

II. 技術的枠組み

プログラミング言語: C# (.NET Framework 4.5.5)

データベース技術フレームワーク: Dapper

Word文書のエクスポート: NPOI

アクセス方法: WinFormウィンドウアプリケーション、Windowsオペレーティングシステム上で直接実行可能

III. 機能紹介

SQL Server、MySQL (5.7、8.0)、SQLite の 3 つのデータ型をサポートし、継続的に更新されます。

Word、HTML、Markdown 形式でのエクスポートをサポートします。

エクスポートされたコンテンツには、データ テーブル (フィールドの詳細、フィールドのコメント、長さ、既定値など)、テーブル作成スクリプト、ビューとビュー スクリプト、ストアド プロシージャとスクリプトが含まれます。

ドキュメントを生成しながら直接開くことをサポートします。

データベースのバックアップをサポートします (現在は SQL Server からの .bak バックアップ ファイルのエクスポートのみをサポートします)。

IV. コードデモンストレーション

1. データベース情報を取得するためのコード

 /// <要約>
///データベースから文字列を取得する
/// </サマリー>
/// <パラメータ名= "サーバー名" ></パラメータ>
/// <パラメータ名= "uid" ></パラメータ>
/// <パラメータ名= "pwd" ></パラメータ>
/// <パラメータ名= "db" ></パラメータ>
/// <戻り値> </戻り値>
公開文字列 GetConnectioning (文字列 servername 文字列 uid 文字列 pwd 文字列 db 文字列 port )
{
文字列を返します。フォーマット( "server={0};uid={1};pwd={2};database={3}" servername uid pwd db )です。
}
/// <要約>
///データベースのリストを取得する
/// </サマリー>
/// <パラメータ名= "conStr" ></パラメータ>
/// <戻り値> </戻り値>
パブリックリスト<文字列> GetDBNameList (文字列 conStr )
{
//リスト< DBName > list =新しいリスト< DBName > ( ) ;
文字列 sql = "master.dbo.sysdatabases から [name] を選択します (DBId>6、Order By [Name]) " ;
試す
{
( SqlConnection 接続=新しい SqlConnection ( conStr ) )を使用します
{
var list = connection .Query <文字列> ( sql ) .ToList ( ) ;
リストを返します
}
}
キャッチ
{
nullを返します
}

}

パブリック リスト< DBModel > GetDBList (文字列 conStr )
{
//リスト< DBName > list =新しいリスト< DBName > ( ) ;
文字列 sql = "master.dbo.sysdatabases から [name] を選択します (DBId>6、Order By [Name]) " ;
試す
{
( SqlConnection 接続=新しい SqlConnection ( conStr ) )を使用します
{
var list = connection .Query < DBModel > ( sql ) .ToList ( ) ;
リストを返します
}
}
キャッチ
{
nullを返します
}

}
/// <要約>
///特定のデータベース内のテーブル名のリストを取得します
/// </サマリー>
/// <パラメータ名= "conStr" ></パラメータ>
/// <戻り値> </戻り値>

パブリック リスト<TableModel> GetDBTableList (文字列 conStr 文字列 dbName = "" )
{
var list =新しいリスト<TableModel> ( ) ;
//文字列 sql = "SELECT TABLE_NAME as name FROM INFORMATION_SCHEMA.TABLES where TABLE_TYPE='BASE TABLE' " ;
文字列 sql = "a.name AS tableName、CONVERT(NVARCHAR(100)、isnull(g.[value]、'')) AS tableDesc を sys.tables から選択し、sys.extended_properties g を (a.object_id = g.major_id AND g.minor_id = 0) で左結合します" ;
試す
{
( SqlConnection 接続=新しい SqlConnection ( conStr ) )を使用します
{
list = connection .Query < TableModel > ( sql ) .ToList ( ) ;
}
}
キャッチ
{

}
リストを返します
}
/// <要約>
///特定のデータベースからストアドプロシージャを取得する
/// </サマリー>
/// <パラメータ名= "conStr" ></パラメータ>
/// <パラメータ名= "db" ></パラメータ>
/// <戻り値> </戻り値>
パブリックリスト< ProcModel > GetProcList (文字列 conStr 文字列 dbName = "" )
{
var list =新しいリスト< ProcModel > ( ) ;
文字列 sql = @ " procNameとしてnameを選択し、(syscommentsからid=OBJECT_ID(name)のテキストを選択)をproDerailsとして
dbo.sysobjects から、OBJECTPROPERTY(id, N'IsProcedure') = 1 で名前順に並べ替え " ;
試す
{
( SqlConnection 接続=新しい SqlConnection ( conStr ) )を使用します
{
リスト=接続.Query < ProcModel > ( sql ) .ToList ( ) ;
}
}
キャッチ
{

}
リストを返します
}
/// <要約>
///特定のデータベースからビューを取得します
/// </サマリー>
/// <パラメータ名= "conStr" ></パラメータ>
/// <パラメータ名= "db" ></パラメータ>
/// <戻り値> </戻り値>
パブリック リスト<ViewModel> GetViewList (文字列 conStr 文字列 dbName = "" )
{
var list =新しいリスト< ViewModel > ( ) ;
文字列 sql = @ " viewName として name を選択し、(syscomments から id=OBJECT_ID(name) のテキストを選択) を viewDerails として選択します
dbo.sysobjects から、OBJECTPROPERTY(id, N'IsView') = 1 で名前順に並べ替え " ;
試す
{
( SqlConnection 接続=新しい SqlConnection ( conStr ) )を使用します
{
list = connection .Query < ViewModel > ( sql ) .ToList ( ) ;
}
}
キャッチ
{

}
リストを返します
}

/// <要約>
///フィールド情報を取得する
/// </サマリー>
/// <パラメータ名= "テーブル名" ></パラメータ>
/// <パラメータ名= "conStr" ></パラメータ>
/// <戻り値> </戻り値>
パブリック リスト< TableDetail > GetTableDetail (文字列 tableName 文字列 conStr 文字列 dbName = "" )
{
var list =新しいリスト<TableDetail> ( ) ;
StringBuilder sb =新しい 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、fieldLenth = 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`はクエリ対象のテーブル名です。赤いWHERE条件を削除すると、存在するテーブルに関する情報のみが取得されます。
sb .Append ( "WHERE d.name = '" + tableName + "' ORDER BY a.id, a.colorder, d.name" ) ;
試す
{
( SqlConnection 接続=新しい SqlConnection ( conStr ) )を使用します
{
list = connection .Query < TableDetail > ( sb .ToString ( ) ) .ToList ( ) ;
}
}
キャッチ
{ }

リストを返します
}


2. HTMLドキュメントコードをエクスポートする

 /// <要約>
/// HTMLファイルを生成する
/// </サマリー>
/// <パラメータ名= "リスト" ></パラメータ>
/// <パラメータ名= "conStr" ></パラメータ>
/// <パラメータ名= "db" ></パラメータ>
/// <パラメータ名= "type" ></パラメータ>
public void CreateToHtml ( List < TableModel > list string conStr string db int type List < string > checkList )
{
StringBuilder sb =新しい StringBuilder ( ) ;
sb .Append ( "<html><meta charset=\"utf-8\" /><meta http-equiv = \"Content-Language\" content = \"zh-CN\" >" ) ;
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>" ) ;


GetDBService (タイプ) ;

#region テーブルを作成する
if ( checkList .Where ( m => m .Equals ( "Table" ) ) .Count ( ) > 0 )
{
sb.Append ( "<h2>I. テーブル構造</h2>" ) ;
sb.Append ( "" ) ;
sb.Append ( "" ) ;
if (リスト.Count > 0 )
{
foreach ( var リスト内の項目)
{
if ( item .tableDesc != null && item .tableDesc != "" )
{
sb .Append ( "<h3>テーブル名:" + item .tableName + "(" + item .tableDesc + ")</h3>" ) ;
}
それ以外
{
sb.Append ( "<h3>table_name:" + item.tableName + "</h3>" ) ;
}
sb .Append ( " <table cellspacing=\"0\" cellpadding=\"5\" border=\"1\" width=\"100%\" bordercolorlight=\"#4F7FC9\" bordercolordark=\"#D3D8E0\">" ) ;
sb.Append ( "<thead bgcolor=\"#E3EFFF\"> <th>シーケンス番号</th><th>フィールド名</th><th>識別子</th><th>主キー</th><th>フィールド タイプ</th><th>フィールド長</th><th>Null 値の許可</th><th>フィールドのデフォルト値</th><th>フィールドの備考</th></thead>" ) ;
sb.Append ( "<tbody>" ) ;
//最初の行はヘッダーなので、2 行目から開始します。
整数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 .fieldLenth + "</td>" ) ;
sb .Append ( "<td>" + itm .isAllowEmpty + "</td>" ) ;
sb .Append ( "<td>" + itm .defaultValue + "</td>" ) ;
sb .Append ( "<td>" + itm .fieldDesc + "</td>" ) ;
sb.Append ( "</tr>" ) ;
++ ;
}
}
sb .Append ( "</tbody></table>" ) ;

sb .Append ( "<h4>" + item .tableName + "テーブル作成スクリプト</h4><br/>" ) ;
sb .Append ( "<span>" + service .GetTableSQL ( item .tableName , conStr ) + "</span>" ) ;


}
}
}
#終了領域

#region ストアドプロシージャ
If ( checkList.Where ( m => m.Equals ( "ストアドプロシージャ" ) ) .Count ( ) > 0 )
{
リスト< ProcModel > proclist =新しいリスト< ProcModel > ( ) ;
proclist =サービス.GetProcList ( conStr , db ) ;
sb.Append ( "<h2>II. ストアド プロシージャ</h2>" ) ;
if ( proclist != null && proclist .Count > 0 )
{
foreach ( proclist内の変数項目)
{
sb.Append ( "<h3>ストアド プロシージャ名: " + item.procName + "</h3>" ) ;
sb .Append ( "<span>" + item .proDerails + "</span>" ) ;
}
}
}
#終了領域

#地域ビュー
if ( checkList .Where ( m => m .Equals ( "View" ) ) .Count ( ) > 0 )
{
リスト< ViewModel > viewlist =新しいリスト< ViewModel > ( ) ;
viewlist =サービス.GetViewList ( conStr , db ) ;
sb.Append ( "<h2>III. ビュー</h2>" ) ;
if (ビューリスト.Count > 0 )
{

foreach ( var item in viewlist )
{
sb.Append ( "<h3>ビュー名: " + item.viewName + "</h3>" ) ;
sb .Append ( "<span>" + item .viewDerails + "</span>" ) ;
}
}
}
#終了領域

sb .Append ( "</body></html>" ) ;
sb.ToString ( ) ;
string filename = db + "-データベースドキュメント" ; //ファイル名
SaveFileDialog saveDialog = new SaveFileDialog ( ) ;
saveDialog .DefaultExt = "html" ;
saveDialog.Filter = "html ファイル|*.html" ;
saveDialog .FileName =ファイル名;
保存ダイアログ.ShowDialog ( ) ;
ファイル名= saveDialog.FileName ;
if ( filename.IndexOf ( :" ) < 0 ) return ; //キャンセルがクリックされました
StreamWriter sw1 =新しい StreamWriter ( saveDialog .FileName false ) ;
sw1.WriteLine ( sb ) ;
sw1.Close ( ) ;
System .Diagnostics .Process .Start (ファイル名) ;

}

V. 事業実績

アプリケーションのメインインターフェース

3 つのドキュメント生成タイプをサポートしています。一度に選択できるのは 1 つだけで、Markdown 形式が推奨されます。

Word文書生成結果

HTMLドキュメント生成効果

Markdownドキュメント効果

SQL Server データベースのバックアップ

VI.プロジェクトオープンソースアドレス

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

gitee: https://gitee.com/hgm1989/SqlToDocTool

Gitコード: https://gitcode.net/xishining/SqlToDocTool