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 |