diff --git a/App.config b/App.config index ecdcf8a..1009345 100644 --- a/App.config +++ b/App.config @@ -1,5 +1,8 @@ + + + diff --git a/ChangesLog.txt b/ChangesLog.txt index 57cd03b..c359d22 100644 --- a/ChangesLog.txt +++ b/ChangesLog.txt @@ -1,6 +1,13 @@ SQLPlayer Data Script Writer - Changes Log ========================================== +ver.2.4 @ 08/09/2021 +- Support for datetimeoffset type (#20) +- Config data types to not be scripted (#20) +- Fixed SQL reading structure of a table (#23) +- Do not script calculated columns (#18) +- Option to open target folder in Explorer + ver.2.3 @ 02/12/2020 - Support for Temporal tables (#10) - Support for Time data type (#14) diff --git a/DataScriptWriter.csproj b/DataScriptWriter.csproj index 5d5c6ef..eb383ab 100644 --- a/DataScriptWriter.csproj +++ b/DataScriptWriter.csproj @@ -1,178 +1,179 @@ - - - - - Debug - AnyCPU - {77F673FB-AB5B-46C4-A36A-94FB7D183940} - WinExe - Properties - DataScriptWriter - DataScriptWriter - v4.7.2 - 512 - SAK - SAK - SAK - SAK - - - - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - Resources\if_Archive_box_data_file_storage_1886362.ico - - - - packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.Data.v18.2.dll - - - packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.Office.v18.2.Core.dll - - - packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.RichEdit.v18.2.Core.dll - - - packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.Utils.v18.2.dll - - - packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.Utils.v18.2.UI.dll - - - packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.XtraBars.v18.2.dll - - - packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.XtraEditors.v18.2.dll - - - packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.XtraGrid.v18.2.dll - - - packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.XtraLayout.v18.2.dll - - - packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.XtraTreeList.v18.2.dll - - - packages\Microsoft.SqlServer.Types.14.0.1016.290\lib\net40\Microsoft.SqlServer.Types.dll - - - - - - - - - - - - - - - Form - - - ConnectDbForm.cs - - - Form - - - frmMain.cs - - - Form - - - frmNoteForm.cs - - - - - - - - ConnectDbForm.cs - - - frmMain.cs - - - frmNoteForm.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - Designer - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - PreserveNewest - - - - - - - - - - - - - - - - {3e8ff80a-749b-47ec-941d-1a98eff4540c} - CAMOsoft.DbUtils - - - + + + + + Debug + AnyCPU + {77F673FB-AB5B-46C4-A36A-94FB7D183940} + WinExe + Properties + DataScriptWriter + DataScriptWriter + v4.7.2 + 512 + SAK + SAK + SAK + SAK + + + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + Resources\if_Archive_box_data_file_storage_1886362.ico + + + + packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.Data.v18.2.dll + + + packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.Office.v18.2.Core.dll + + + packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.RichEdit.v18.2.Core.dll + + + packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.Utils.v18.2.dll + + + packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.Utils.v18.2.UI.dll + + + packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.XtraBars.v18.2.dll + + + packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.XtraEditors.v18.2.dll + + + packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.XtraGrid.v18.2.dll + + + packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.XtraLayout.v18.2.dll + + + packages\XtraEditor.Controls.18.2.4\lib\net45\DevExpress.XtraTreeList.v18.2.dll + + + packages\Microsoft.SqlServer.Types.14.0.1016.290\lib\net40\Microsoft.SqlServer.Types.dll + + + + + + + + + + + + + + + + Form + + + ConnectDbForm.cs + + + Form + + + frmMain.cs + + + Form + + + frmNoteForm.cs + + + + + + + + ConnectDbForm.cs + + + frmMain.cs + + + frmNoteForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + Designer + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + PreserveNewest + + + + + + + + + + + + + + + + {3e8ff80a-749b-47ec-941d-1a98eff4540c} + CAMOsoft.DbUtils + + + + --> \ No newline at end of file diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index fa35389..c3f02c8 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -108,11 +108,12 @@ internal static System.Drawing.Bitmap if_script_lightning_36406 { ///WHERE o.name = parsename(@TableName, 1) and s.name = parsename(@TableName, 2) ///); ///WITH cc as ( - /// SELECT c.name as COLUMN_NAME, c.is_identity from sys.objects o + /// SELECT c.name as COLUMN_NAME, c.is_identity, c.is_computed + /// FROM sys.objects o /// INNER JOIN sys.columns c ON c.object_id = o.object_id /// WHERE o.object_id = @oid ///) - ///select c.ORDINAL_POSITION, c.COLUMN_NAME, c.DATA_TYPE, co.constraint_type, quotename(c [rest of string was truncated]";. + ///select c.ORDINAL_POSITION, c.COLUMN_NAME, c.DATA_TYPE, co.constrain [rest of string was truncated]";. /// internal static string LoadColumnInfo { get { @@ -128,12 +129,12 @@ internal static string LoadColumnInfo { ///WHERE o.name = parsename(@TableName, 1) and s.name = parsename(@TableName, 2) ///); ///WITH cc as ( - /// SELECT c.name as COLUMN_NAME, c.is_identity, c.generated_always_type + /// SELECT c.name as COLUMN_NAME, c.is_identity, c.generated_always_type, c.is_computed /// from sys.objects o /// INNER JOIN sys.columns c ON c.object_id = o.object_id /// WHERE o.object_id = @oid ///) - ///select c.ORDINAL_POSITION, c.COLUMN_NAME, c.DATA_TYPE, co.c [rest of string was truncated]";. + ///select c.ORDINAL_POSITION, c.COLUMN_NAME, c. [rest of string was truncated]";. /// internal static string LoadColumnInfo2016andLater { get { diff --git a/Properties/Resources.resx b/Properties/Resources.resx index ad3c9c9..8b563c4 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -153,7 +153,8 @@ INNER JOIN sys.schemas s on s.schema_id = o.schema_id WHERE o.name = parsename(@TableName, 1) and s.name = parsename(@TableName, 2) ); WITH cc as ( - SELECT c.name as COLUMN_NAME, c.is_identity from sys.objects o + SELECT c.name as COLUMN_NAME, c.is_identity, c.is_computed + FROM sys.objects o INNER JOIN sys.columns c ON c.object_id = o.object_id WHERE o.object_id = @oid ) @@ -163,6 +164,7 @@ LEFT JOIN ( select tc.TABLE_SCHEMA, tc.TABLE_NAME, kcu.COLUMN_NAME, tc.constraint_type from information_schema.table_constraints tc join information_schema.key_column_usage kcu on + tc.table_schema = kcu.table_schema and tc.table_name = kcu.table_name and tc.constraint_name = kcu.constraint_name where tc.table_name = parsename(@TableName, 1) and @@ -171,7 +173,8 @@ LEFT JOIN ( ) as co on co.TABLE_SCHEMA = c.TABLE_SCHEMA and co.TABLE_NAME = c.TABLE_NAME and co.COLUMN_NAME = c.COLUMN_NAME LEFT JOIN cc ON cc.COLUMN_NAME = c.COLUMN_NAME where c.table_name = parsename(@TableName, 1) and - c.table_schema = parsename(@TableName, 2) ; +c.table_schema = parsename(@TableName, 2) +and cc.is_computed = 0 DECLARE @Tablename nvarchar(100) = '{0}'; @@ -181,7 +184,7 @@ INNER JOIN sys.schemas s on s.schema_id = o.schema_id WHERE o.name = parsename(@TableName, 1) and s.name = parsename(@TableName, 2) ); WITH cc as ( - SELECT c.name as COLUMN_NAME, c.is_identity, c.generated_always_type + SELECT c.name as COLUMN_NAME, c.is_identity, c.generated_always_type, c.is_computed from sys.objects o INNER JOIN sys.columns c ON c.object_id = o.object_id WHERE o.object_id = @oid @@ -192,6 +195,7 @@ LEFT JOIN ( select tc.TABLE_SCHEMA, tc.TABLE_NAME, kcu.COLUMN_NAME, tc.constraint_type from information_schema.table_constraints tc join information_schema.key_column_usage kcu on + tc.table_schema = kcu.table_schema and tc.table_name = kcu.table_name and tc.constraint_name = kcu.constraint_name where tc.table_name = parsename(@TableName, 1) and @@ -200,7 +204,8 @@ LEFT JOIN ( ) as co on co.TABLE_SCHEMA = c.TABLE_SCHEMA and co.TABLE_NAME = c.TABLE_NAME and co.COLUMN_NAME = c.COLUMN_NAME LEFT JOIN cc ON cc.COLUMN_NAME = c.COLUMN_NAME where c.table_name = parsename(@TableName, 1) -and c.table_schema = parsename(@TableName, 2) -and cc.generated_always_type = 0 +and c.table_schema = parsename(@TableName, 2) +and cc.generated_always_type = 0 +and cc.is_computed = 0 \ No newline at end of file diff --git a/ScriptWriter.cs b/ScriptWriter.cs index a8bc69b..3c02a70 100644 --- a/ScriptWriter.cs +++ b/ScriptWriter.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Configuration; +using System.Linq; using System.Text; using System.Data; using System.IO; @@ -15,14 +17,20 @@ public class ScriptWriter private DataTable _dt; DataView _dv; public bool OptionProcWrapUp = false; - private string _BatchSeparator = "GO"; + private string _BatchSeparator = "GO"; + private List _excludeDataTypes = new List(); + public ScriptWriter(CAMOsoft.DbUtils.MsSqlSession db, string outputFolder) { _db = db; _OutputFolder = outputFolder; string sql = "SELECT @@SPID AS SPID, SUSER_NAME() AS UserName, DB_NAME() AS DbName, @@SERVERNAME AS ServerName, @@VERSION as ServerVersion;"; - _ServerInfoRow = _db.SelectRow(sql); + _ServerInfoRow = _db.SelectRow(sql); + + if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["excludeDataTypes"])) + _excludeDataTypes = new List(ConfigurationManager.AppSettings["excludeDataTypes"].Split(new char[] { ';' })); + InitTable(); } @@ -92,8 +100,21 @@ private DataTable LoadColumnsInfo(ScriptObject so) if (IsSQLServer2016orLater()) queryDef = "LoadColumnInfo2016andLater"; string sql = Properties.Resources.ResourceManager.GetString(queryDef); sql = sql.Replace("{0}", so.FullName); - DataTable dt = _db.SelectTable(sql, "ColumnInfo"); - return dt; + DataTable dt = _db.SelectTable(sql, "ColumnInfo"); + string filter = string.Empty; + + if(_excludeDataTypes.Count >= 1) + filter = string.Format("DATA_TYPE NOT in ({0})", string.Join(",", _excludeDataTypes.Select(x => string.Format("'{0}'", x)))); + + var filteredDr = dt.Select(filter); + var filteredDt = new DataTable(); + + if (filteredDr.Length != 0) + filteredDt = filteredDr.CopyToDataTable(); + filteredDt.TableName = dt.TableName; + + return filteredDt; + } private bool IsSQLServer2016orLater() @@ -167,7 +188,10 @@ private StringBuilder SerializeRowValues(DataRow row, DataTable colInfoTable, st case "binary": case "varbinary": v = "0x" + ByteArrayToHex((byte[])row[col]); - break; + break; + case "datetimeoffset": + v = String.Format("'{0:yyyyMMdd HH:mm:ss.fffffff} {1}'", row[col], row[col].ToString().Substring(row[col].ToString().Length - 6)); + break; default: throw new Exception("Unknown SQL data type! (" + sqltype + ")"); } @@ -427,6 +451,15 @@ private void ScriptTableInitialInsert(ScriptObject so, DataTable colInfoTable, D } + public string OutputFolder + { + get + { + return _OutputFolder; + } + } + + public string UserName { get { diff --git a/frmMain.cs b/frmMain.cs index ce5832b..6bd609e 100644 --- a/frmMain.cs +++ b/frmMain.cs @@ -74,6 +74,11 @@ private void bbiScript_ItemClick(object sender, DevExpress.XtraBars.ItemClickEve cnt++; } barStaticItem1.Caption = String.Format("Done. {0} tables were scripted.", cnt); + DialogResult r = MessageBox.Show( "Do you want to open target location with File Explorer?", "Open target location", MessageBoxButtons.YesNo); + if (r == DialogResult.Yes) + { + Process.Start("explorer.exe", _gen.OutputFolder); + } } private void gridControl1_DoubleClick(object sender, EventArgs e)