Exemple #1
0
    public static ReadOnlyCollection <Line> Create(string table, IReadOnlyCollection <string> columns, IReadOnlyCollection <IReadOnlyCollection <string> > rows)
    {
        Assert.IsTrue(!table.IsNullOrEmpty());
        Assert.IsTrue(!table.IsNullOrEmpty());
        ArgumentNullException.ThrowIfNull(columns);
        ArgumentNullException.ThrowIfNull(rows);
        Assert.IsTrue(columns.Count > 0);
        Assert.IsTrue(rows.All(row => row.Count == columns.Count));

        var textBuilder = new TextBuilder();

        textBuilder.Add($"insert into {table}({columns.Join(",")})");
        textBuilder.Add("values");

        using (textBuilder.Indent(1))
        {
            foreach (var indexedRow in rows.SelectIndexed())
            {
                if (indexedRow.Index > 0)
                {
                    textBuilder.AddToLastLine(",");
                }

                var values = indexedRow.Value.Join(",");
                textBuilder.Add($"({values})");
            }
        }

        return(textBuilder.ToLines());
    }
Exemple #2
0
    private string CreateUpdateScript()
    {
        var connectionString = DatabaseNode.Databases.Server.ConnectionString;
        GetTableSchemaResult getTableSchemaResult;

        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            var tableName = $"{DatabaseNode.Name}.{_owner}.{_name}";
            getTableSchemaResult = TableSchema.GetTableSchema(connection, tableName);
        }

        var textBuilder = new TextBuilder();

        textBuilder.Add($"update {Name}");
        textBuilder.Add("set");
        using (textBuilder.Indent(1))
        {
            var last = getTableSchemaResult.Columns.Count - 1;
            foreach (var item in getTableSchemaResult.Columns.SelectIndexed())
            {
                var column = item.Value;
                var line   = new StringBuilder();
                line.Append($"{column.ColumnName} = @{column.ColumnName}");
                if (item.Index < last)
                {
                    line.Append(',');
                }
                textBuilder.Add(line.ToString());
            }
        }

        if (getTableSchemaResult.UniqueIndexColumns.Count > 0)
        {
            textBuilder.Add("where");
            using (textBuilder.Indent(1))
            {
                var last = getTableSchemaResult.UniqueIndexColumns.Count - 1;
                foreach (var item in getTableSchemaResult.UniqueIndexColumns.SelectIndexed())
                {
                    var columnId = item.Value.ColumnId;
                    var column   = getTableSchemaResult.Columns.First(i => i.ColumnId == columnId);
                    var line     = new StringBuilder();
                    line.Append($"{column.ColumnName} = @{column.ColumnName}");
                    if (item.Index < last)
                    {
                        line.Append(',');
                    }
                    textBuilder.Add(line.ToString());
                }
            }
        }

        var script = textBuilder.ToLines().ToIndentedString("    ");

        return(script);
    }
Exemple #3
0
    public static IDisposable AddBlock(this TextBuilder indentedTextBuilder, string begin, string end)
    {
        indentedTextBuilder.Add(begin);
        var indentation = indentedTextBuilder.Indent(1);

        return(new Disposer(() =>
        {
            indentation.Dispose();
            indentedTextBuilder.Add(end);
        }));
    }
        public static ReadOnlyCollection <Line> Create(string table, IReadOnlyCollection <ColumnNameValue> whereColumns)
        {
            Assert.IsTrue(!table.IsNullOrEmpty());
            Assert.IsNotNull(whereColumns);
            Assert.IsTrue(whereColumns.Count > 0);
            var textBuilder = new TextBuilder();

            textBuilder.Add($"delete {table}");
            textBuilder.Add("where");
            using (textBuilder.Indent(1))
                textBuilder.Add(whereColumns.Join(" and"));
            return(textBuilder.ToLines());
        }
Exemple #5
0
        public static ReadOnlyCollection <Line> Create(string message)
        {
            var textBuilder = new TextBuilder();

            textBuilder.Add("textBuilder.Add(\"if @@rowcount = 0\");");
            textBuilder.Add("using (textBuilder.AddBlock(\"begin\", \"end\"))");
            using (textBuilder.AddCSharpBlock())
            {
                textBuilder.Add($"textBuilder.Add(\"raiserror('{message}',16,1)\");");
                textBuilder.Add("textBuilder.Add(\"return\");");
            }

            return(textBuilder.ToLines());
        }
Exemple #6
0
            public static ReadOnlyCollection <Line> CreateDeleteSqlStatement(Guid id, long version)
            {
                var whereColumns = new[]
                {
                    new ColumnNameValue("Id", id.ToSqlConstant()),
                    new ColumnNameValue("Version", version.ToSqlConstant())
                };
                var deleteSqlStatement = DeleteSqlStatementFactory.Create("dbo.OrmSampleTable", whereColumns);
                var validation         = ValidationFactory.Create("delete dbo.OrmSampleTable failed");
                var textBuilder        = new TextBuilder();

                textBuilder.Add(deleteSqlStatement);
                textBuilder.Add(validation);
                return(textBuilder.ToLines());
            }
Exemple #7
0
    private static ReadOnlyCollection <Line> GetConstructor(string name, ReadOnlyCollection <DataTransferObjectField> fields)
    {
        var textBuilder = new TextBuilder();

        var parameters = fields.Select(field => $"{field.Type} {field.Name.ToCamelCase()}").Join(", ");

        textBuilder.Add($"public {name}({parameters})");
        using (textBuilder.AddCSharpBlock())
        {
            foreach (var field in fields)
            {
                textBuilder.Add($"{field.Name} = {field.Name.ToCamelCase()};");
            }
        }

        return(textBuilder.ToLines());
    }
    public static ReadOnlyCollection <Line> Create(string schema, string table, ReadOnlyCollection <Column> columns)
    {
        var textBuilder = new TextBuilder();

        textBuilder.Add($"public static ReadOnlyCollection<Line> CreateInsertSqlStatement(IEnumerable<{table}> records)");
        using (textBuilder.AddCSharpBlock())
        {
            //textBuilder.Add($"var sqlTable = new SqlTable(\"{_owner}\",\"{_name}\", new[]");
            //using (textBuilder.AddCSharpBlock())
            //{
            //    sequence = new Sequence();
            //    foreach (var column in columns)
            //    {
            //        var last = sequence.Next() == columns.Count - 1;
            //        var name = column.ColumnName;
            //        var separator = !last ? "," : null;
            //        textBuilder.Add($"\"{name}\"{separator}");
            //    }
            //}

            //textBuilder.AddToLastLine(".ToReadOnlyCollection());");
            //textBuilder.Add(Line.Empty);

            textBuilder.Add("var columns = new[]");
            using (textBuilder.AddCSharpBlock())
            {
                foreach (var indexedColumn in columns.SelectIndexed())
                {
                    if (indexedColumn.Index > 0)
                    {
                        textBuilder.AddToLastLine(",");
                    }
                    var column = indexedColumn.Value;
                    textBuilder.Add($"\"{column.ColumnName}\"");
                }
            }

            textBuilder.AddToLastLine(";");
            textBuilder.Add($"var rows = records.Select(record => new[]");
            using (textBuilder.AddCSharpBlock())
            {
                foreach (var indexedColumn in columns.SelectIndexed())
                {
                    if (indexedColumn.Index > 0)
                    {
                        textBuilder.AddToLastLine(",");
                    }
                    var column     = indexedColumn.Value;
                    var methodName = MethodName.GetToSqlConstantMethodName(column.SqlDataTypeName, column.IsNullable);
                    textBuilder.Add($"record.{column.ColumnName}.{methodName}()");
                }
            }

            textBuilder.AddToLastLine(").ToReadOnlyCollection();");
            textBuilder.Add($"var insertSqlStatement = InsertSqlStatementFactory.Create(\"{schema}.{table}\", columns, rows);");
            textBuilder.Add("return insertSqlStatement;");
        }

        return(textBuilder.ToLines());
    }
Exemple #9
0
    public static ReadOnlyCollection <Line> CreateDataTransferObject(string name, ReadOnlyCollection <DataTransferObjectField> fields)
    {
        var textBuilder = new TextBuilder();

        textBuilder.Add($"public sealed class {name}");
        using (textBuilder.AddCSharpBlock())
        {
            foreach (var field in fields)
            {
                textBuilder.Add($"public readonly {field.Type} {field.Name};");
            }

            textBuilder.Add(Line.Empty);
            var constructor = GetConstructor(name, fields);
            textBuilder.Add(constructor);
        }

        return(textBuilder.ToLines());
    }
Exemple #10
0
    public static ReadOnlyCollection <Line> Create(string schema, string table, Column identifierColumn, Column versionColumn)
    {
        var arguments      = new List <string>();
        var csharpTypeName = SqlDataTypeArray.SqlDataTypes.First(i => i.SqlDataTypeName == identifierColumn.SqlDataTypeName).CSharpTypeName;

        arguments.Add($"{csharpTypeName} {identifierColumn.ColumnName.ToCamelCase()}");
        if (versionColumn != null)
        {
            csharpTypeName = SqlDataTypeArray.SqlDataTypes.First(i => i.SqlDataTypeName == versionColumn.SqlDataTypeName).CSharpTypeName;
            arguments.Add($"{csharpTypeName} {versionColumn.ColumnName.ToCamelCase()}");
        }

        var textBuilder = new TextBuilder();

        textBuilder.Add($"public static ReadOnlyCollection<Line> CreateDeleteSqlStatement({arguments.Join(", ")})");
        using (textBuilder.AddCSharpBlock())
        {
            textBuilder.Add("var whereColumns = new[]");
            using (textBuilder.AddCSharpBlock())
            {
                var method = MethodName.GetToSqlConstantMethodName(identifierColumn.SqlDataTypeName, identifierColumn.IsNullable);
                textBuilder.Add($"new ColumnNameValue(\"{identifierColumn.ColumnName}\", {identifierColumn.ColumnName.ToCamelCase()}.{method}())");
                if (versionColumn != null)
                {
                    textBuilder.AddToLastLine(",");
                    method = MethodName.GetToSqlConstantMethodName(versionColumn.SqlDataTypeName, versionColumn.IsNullable);
                    textBuilder.Add($"new ColumnNameValue(\"{versionColumn.ColumnName}\", {versionColumn.ColumnName.ToCamelCase()}.{method}())");
                }
            }

            textBuilder.AddToLastLine(";");
            textBuilder.Add($"var deleteSqlStatement = DeleteSqlStatementFactory.Create(\"{schema}.{table}\", whereColumns);");
            textBuilder.Add($"var validation = ValidationFactory.Create(\"delete {schema}.{table} failed\");");
            textBuilder.Add("var textBuilder = new TextBuilder();");
            textBuilder.Add("textBuilder.Add(deleteSqlStatement);");
            textBuilder.Add("textBuilder.Add(validation);");
            textBuilder.Add("return textBuilder.ToLines();");
        }

        return(textBuilder.ToLines());
    }
Exemple #11
0
            public static ReadOnlyCollection <Line> CreateUpdateSqlStatement(OrmSampleTable record, long expectedVersion)
            {
                var setColumns = new[]
                {
                    new ColumnNameValue("Version", record.Version.ToSqlConstant()),
                    new ColumnNameValue("Text", record.Text.ToNullableNVarChar()),
                    new ColumnNameValue("Timestamp", record.Timestamp.ToSqlConstant())
                };
                var whereColumns = new[]
                {
                    new ColumnNameValue("Id", record.Id.ToSqlConstant()),
                    new ColumnNameValue("Version", expectedVersion.ToSqlConstant())
                };
                var updateSqlStatement = UpdateSqlStatementFactory.Create("dbo.OrmSampleTable", setColumns, whereColumns);
                var validation         = ValidationFactory.Create("update dbo.OrmSampleTable failed");
                var textBuilder        = new TextBuilder();

                textBuilder.Add(updateSqlStatement);
                textBuilder.Add(validation);
                return(textBuilder.ToLines());
            }
    public static ReadOnlyCollection <Line> Create(string table, IReadOnlyCollection <ColumnNameValue> setColumns,
                                                   IReadOnlyCollection <ColumnNameValue> whereColumns)
    {
        Assert.IsTrue(!table.IsNullOrEmpty());
        ArgumentNullException.ThrowIfNull(setColumns);
        Assert.IsTrue(setColumns.Count > 0);
        ArgumentNullException.ThrowIfNull(whereColumns);
        Assert.IsTrue(whereColumns.Count > 0);
        Assert.IsTrue(whereColumns.All(column => !column.Value.IsNullOrEmpty()));

        var textBuilder = new TextBuilder();

        textBuilder.Add($"update {table}");
        textBuilder.Add("set");
        using (textBuilder.Indent(1))
            textBuilder.Add(setColumns.Join(","));

        textBuilder.Add($"where");
        using (textBuilder.Indent(1))
            textBuilder.Add(whereColumns.Join(" and"));

        return(textBuilder.ToLines());
    }
Exemple #13
0
    public static ReadOnlyCollection <Line> Create(string schema, string table, Column identifierColumn, Column versionColumn,
                                                   IReadOnlyCollection <Column> columns)
    {
        var arguments = new List <string>();

        arguments.Add($"{table} record");
        if (versionColumn != null)
        {
            var csharpTypeName = SqlDataTypeArray.SqlDataTypes.First(i => i.SqlDataTypeName == versionColumn.SqlDataTypeName).CSharpTypeName;
            arguments.Add($"{csharpTypeName} expected{versionColumn.ColumnName}");
        }

        var textBuilder = new TextBuilder();

        textBuilder.Add($"public static ReadOnlyCollection<Line> CreateUpdateSqlStatement({arguments.Join(", ")})");
        using (textBuilder.AddCSharpBlock())
        {
            textBuilder.Add("var setColumns = new []");
            using (textBuilder.AddCSharpBlock())
                foreach (var item in columns.SelectIndexed())
                {
                    if (item.Index > 0)
                    {
                        textBuilder.AddToLastLine(",");
                    }
                    var column = item.Value;
                    var method = MethodName.GetToSqlConstantMethodName(column.SqlDataTypeName, column.IsNullable);
                    textBuilder.Add($"new ColumnNameValue(\"{column.ColumnName}\", record.{column.ColumnName}.{method}())");
                }

            textBuilder.AddToLastLine(";");

            textBuilder.Add("var whereColumns = new[]");
            using (textBuilder.AddCSharpBlock())
            {
                var method = MethodName.GetToSqlConstantMethodName(identifierColumn.SqlDataTypeName, identifierColumn.IsNullable);
                textBuilder.Add($"new ColumnNameValue(\"{identifierColumn.ColumnName}\", record.{identifierColumn.ColumnName}.{method}())");
                if (versionColumn != null)
                {
                    textBuilder.AddToLastLine(",");
                    method = MethodName.GetToSqlConstantMethodName(versionColumn.SqlDataTypeName, versionColumn.IsNullable);
                    textBuilder.Add($"new ColumnNameValue(\"{versionColumn.ColumnName}\", expected{versionColumn.ColumnName}.{method}())");
                }
            }

            textBuilder.AddToLastLine(";");
            textBuilder.Add($"var updateSqlStatement = UpdateSqlStatementFactory.Create(\"{schema}.{table}\", setColumns, whereColumns);");
            textBuilder.Add($"var validation = ValidationFactory.Create(\"update {schema}.{table} failed\");");
            textBuilder.Add("var textBuilder = new TextBuilder();");
            textBuilder.Add("textBuilder.Add(updateSqlStatement);");
            textBuilder.Add("textBuilder.Add(validation);");
            textBuilder.Add("return textBuilder.ToLines();");
        }

        return(textBuilder.ToLines());
    }
Exemple #14
0
        private void CsharpOrm_Click(object sender, EventArgs e)
        {
            var connectionString = DatabaseNode.Databases.Server.ConnectionString;
            GetTableSchemaResult getTableSchemaResult;

            using (var connection = new SqlConnection(connectionString))
            {
                connection.Open();
                var tableName = $"{DatabaseNode.Name}.{_owner}.{_name}";
                getTableSchemaResult = TableSchema.GetTableSchema(connection, tableName);
            }

            var dataTransferObjectFields = getTableSchemaResult.Columns
                                           .Select(column =>
            {
                var name           = column.ColumnName;
                var typeName       = column.TypeName;
                var isNullable     = column.IsNullable;
                var csharpTypeName = SqlDataTypeArray.SqlDataTypes.First(i => i.SqlDataTypeName == typeName).CSharpTypeName;
                var csharpType     = CSharpTypeArray.CSharpTypes.First(i => i.Name == csharpTypeName);
                if (isNullable == true && csharpType.Type.IsValueType)
                {
                    csharpTypeName += "?";
                }

                return(new DataTransferObjectField(name, csharpTypeName));
            })
                                           .ToReadOnlyCollection();
            var dataTransferObject = DataTransferObjectFactory.CreateDataTransferObject(_name, dataTransferObjectFields).ToIndentedString("    ");

            var columns = getTableSchemaResult.Columns
                          .Select(i => new Foundation.Data.DbQueryBuilding.Column(i.ColumnName, i.TypeName, i.IsNullable == true))
                          .ToReadOnlyCollection();
            var createInsertSqlSqlStatementMethod = CreateInsertSqlStatementMethodFactory.Create(_owner, _name, columns);

            var identifierColumn = getTableSchemaResult.UniqueIndexColumns
                                   .Select(i => getTableSchemaResult.Columns.First(j => j.ColumnId == i.ColumnId))
                                   .Select(i => new Foundation.Data.DbQueryBuilding.Column(i.ColumnName, i.TypeName, i.IsNullable == true))
                                   .First();
            var versionColumn = columns.FirstOrDefault(i => i.ColumnName == "Version");

            columns = columns.Where(i => i.ColumnName != identifierColumn.ColumnName).ToReadOnlyCollection();
            var createUpdateSqlStatementMethod = CreateUpdateSqlStatementMethodFactory.Create(_owner, _name, identifierColumn, versionColumn, columns);
            var createDeleteSqlStatementMethod = CreateDeleteSqlStatementMethodFactory.Create(_owner, _name, identifierColumn, versionColumn);

            var textBuilder = new TextBuilder();

            textBuilder.Add(dataTransferObject);
            textBuilder.Add(Line.Empty);
            textBuilder.Add($"public static class {_name}SqlStatementFactory");
            using (textBuilder.AddCSharpBlock())
            {
                textBuilder.Add(createInsertSqlSqlStatementMethod);
                textBuilder.Add(Line.Empty);
                textBuilder.Add(createUpdateSqlStatementMethod);
                textBuilder.Add(Line.Empty);
                textBuilder.Add(createDeleteSqlStatementMethod);
            }

            Clipboard.SetText(textBuilder.ToLines().ToIndentedString("    "));
            var queryForm = (QueryForm)DataCommanderApplication.Instance.MainForm.ActiveMdiChild;

            queryForm.SetStatusbarPanelText("Copying script to clipboard finished.",
                                            queryForm.ColorTheme != null ? queryForm.ColorTheme.ForeColor : SystemColors.ControlText);
        }
    private void CreateDatabaseSnapshotScriptToClipboardMenuItem_Click(object?sender, EventArgs e)
    {
        var databaseName = _name;

        var databaseSnapshotName = $"{databaseName}_Snapshot_{DateTime.Now.ToString("yyyyMMdd_HHmm")}";
        var logical_file_name    = GetLogicalFileName(databaseName);
        var osFileName           = $"D:\\Backup\\{databaseSnapshotName}.ss";

        var textBuilder = new TextBuilder();

        textBuilder.Add($"CREATE DATABASE [{databaseSnapshotName}]");
        textBuilder.Add("ON");

        using (textBuilder.AddBlock("(", ")"))
        {
            textBuilder.Add($"NAME = {logical_file_name},");
            textBuilder.Add($"FILENAME = {osFileName.ToVarChar()}");
        }

        textBuilder.Add($"AS SNAPSHOT OF [{databaseName}]");
        textBuilder.Add(Line.Empty);
        textBuilder.Add("USE master");
        textBuilder.Add($"ALTER DATABASE [{databaseName}] SET SINGLE_USER");
        textBuilder.Add($"RESTORE DATABASE [{databaseName}] FROM");
        textBuilder.Add($"DATABASE_SNAPSHOT = {databaseSnapshotName.ToVarChar()}");
        textBuilder.Add($"ALTER DATABASE [{databaseName}] SET MULTI_USER WITH NO_WAIT");

        var text      = textBuilder.ToLines().ToIndentedString("  ");
        var queryForm = (IQueryForm)sender;

        queryForm.ClipboardSetText(text);
    }