Пример #1
0
        public virtual string[] GenerateSqlCreateField()
        {
            List <string> sqls = new List <string>();
            StringBuilder sql  = new StringBuilder();

            string sNull = AllowNull ? "null" : "not null";

            sql.AppendLine("if not exists (select 1 from INFORMATION_SCHEMA.COLUMNS");
            sql.AppendLine("  where TABLE_NAME = '" + TableName + "' and COLUMN_NAME = '" + FieldName + "')");
            sql.AppendLine("  begin");
            sql.AppendLine("    alter table [" + TableName + "] add [" + FieldName + "] " + FieldType + ";");

            sql.AppendLine("  end;");

            sqls.Add(sql.ToString());

            if (!(this is PrimaryKeyFieldSchema))
            {
                sql = new StringBuilder();
                sql.AppendLine("if not exists (");
                sql.AppendLine("  select 1");
                sql.AppendLine("  from INFORMATION_SCHEMA.COLUMNS");
                sql.AppendLine("  where");
                sql.AppendLine("    TABLE_NAME = '" + TableName + "' and");
                sql.AppendLine("    COLUMN_NAME = '" + FieldName + "' and");
                sql.AppendLine("    COLUMN_DEFAULT is not null)");
                sql.AppendLine("  begin");
                sql.AppendLine("    alter table [" + TableName + "] add constraint [DF_" + TableName + "_" + FieldName + "] default ((" + DatabaseSchema.GetDefaultValue(FieldType, AllowNull) + ")) for [" + FieldName + "];");
                sql.AppendLine("  end;");
                sqls.Add(sql.ToString());

                if (!AllowNull)
                {
                    sqls.Add("update [" + TableName + "] set [" + FieldName + "] = " + DatabaseSchema.GetDefaultValue(FieldType, AllowNull) + " where [" + FieldName + "] is null;");
                }
            }

            sqls.Add("  alter table [" + TableName + "] alter column [" + FieldName + "] " + FieldType + " " + sNull + ";");

            return(sqls.ToArray());
        }
Пример #2
0
        public void RestoreBackup2(StreamReader reader, DatabaseSchema database, int backupVersion, long totalRowsInDB)
        {
            char          token            = ' ';
            char          lastToken        = ' ';
            StringBuilder tableHeader      = new StringBuilder();
            StringBuilder fieldName        = new StringBuilder();
            StringBuilder sBackupVersion   = new StringBuilder();
            StringBuilder sDatabaseVersion = new StringBuilder();

            TableSchema currentTable = null;
            FieldSchema currentField = null;

            bool          readingTableHeader  = false;
            bool          readingFieldName    = false;
            string        tableName           = "";
            int           rowCount            = 0;
            DataTable     dataTable           = new DataTable();
            bool          readingFieldData    = false;
            StringBuilder fieldColumn         = new StringBuilder();
            bool          expectingColumnName = false;
            char          lastLastToken       = ' ';
            int           fieldsRead          = 0;
            int           tableCount          = 0;

            while (true)
            {
                if (!reader.EndOfStream)
                {
                    token = (char)reader.Read();
                }

                if (token == '[' && lastToken != '\\' && !readingTableHeader && !expectingColumnName && !readingFieldData)   // Start of table header
                {
                    readingTableHeader = true;
                    tableHeader        = new StringBuilder();
                }
                else if (token == '[' && lastToken != '\\' && !readingTableHeader && expectingColumnName)   // Start of table header
                {
                    fieldName           = new StringBuilder();
                    readingFieldName    = true;
                    expectingColumnName = false;
                }
                else if (token == '[' && ((lastToken == '¤' && lastLastToken != '\\' && readingFieldData) || (readingFieldData && currentField.FieldType == "bit")) || reader.EndOfStream)   // End of column data
                {
                    readingFieldData = false;
                    string sData;

                    // Liten fuling
                    if (reader.EndOfStream)
                    {
                        fieldColumn.Append(token);
                    }

                    if (currentField.FieldType != "bit")
                    {
                        sData = fieldColumn.ToString().Substring(0, fieldColumn.ToString().Length - 1);
                    }
                    else
                    {
                        sData = fieldColumn.ToString();
                    }

                    string[] array = currentField.SplitDataString(sData);

                    for (int i = 0; i < rowCount; i++)
                    {
                        dataTable.Rows[i][fieldName.ToString()] = array[i];
                    }

                    fieldsRead++;

                    if (fieldsRead == database.GetTable(tableName).DatabaseFields.Count)
                    {
                        if (currentTable.PrimaryKey.IsIdentity)
                        {
                            Connection.Execute("set identity_insert " + currentTable.TableName + " on;");
                        }

                        // Save the table in the database
                        foreach (DataRow dataRow in dataTable.Rows)
                        {
                            string        comma = "";
                            StringBuilder commaSeparatedFieldNames = new StringBuilder();
                            foreach (FieldSchema f in currentTable.DatabaseFields)
                            {
                                commaSeparatedFieldNames.Append(comma + f.FieldName);
                                comma = ", ";
                            }

                            comma = "";
                            StringBuilder commaSeparatedFieldValues = new StringBuilder();
                            foreach (FieldSchema f in currentTable.DatabaseFields)
                            {
                                commaSeparatedFieldValues.Append(comma + f.DeSerializeData((string)dataRow[f.FieldName]));
                                comma = ", ";
                            }

                            string sql = "insert into [" + currentTable.TableName + "] (" + commaSeparatedFieldNames + ") values (" + commaSeparatedFieldValues + ");";
                            Connection.Execute(sql);
                        }

                        if (currentTable.PrimaryKey.IsIdentity)
                        {
                            Connection.Execute("set identity_insert " + currentTable.TableName + " off;");
                        }

                        tableCount += 1;
//                      OnProgress(tableCount, database.Tables.Count());

                        // Reset most values
                        fieldsRead         = 0;
                        readingTableHeader = true;
                        tableHeader        = new StringBuilder();
                    }
                    else
                    {
                        readingFieldName = true;
                        fieldName        = new StringBuilder();
                        fieldColumn      = new StringBuilder();
                    }

                    if (reader.EndOfStream)
                    {
                        break;
                    }
                }
                else if (token == ']' && lastToken != '\\' && readingTableHeader)   // End of table header
                {
                    readingTableHeader = false;

                    string[] array = tableHeader.ToString().Split(";".ToCharArray());
                    tableName    = array[0];
                    currentTable = database.GetTable(tableName);
                    rowCount     = int.Parse(array[1]);

                    OnProgress(tableCount, database.Tables.Count(), "Reading table '" + tableName + "'");

                    // Init data table
                    dataTable = new DataTable();

                    foreach (FieldSchema field in currentTable.DatabaseFields)
                    {
                        dataTable.Columns.Add(field.FieldName, typeof(string));
                    }

                    for (int i = 1; i <= rowCount; i++)
                    {
                        DataRow dataRow = dataTable.NewRow();
                        dataTable.Rows.Add(dataRow);
                    }

                    if (rowCount > 0)
                    {
                        fieldColumn         = new StringBuilder();
                        expectingColumnName = true;
                    }
                }
                else if (token == ']' && lastToken != '\\' && readingFieldName)   // End of field header
                {
                    readingFieldName = false;
                    readingFieldData = true;
                    currentField     = currentTable.GetField(fieldName.ToString());
                }
                else if (readingTableHeader)
                {
                    tableHeader.Append(token);
                }
                else if (readingFieldName)
                {
                    fieldName.Append(token);
                }
                else if (readingFieldData)
                {
                    fieldColumn.Append(token);
                }

                lastLastToken = lastToken;
                lastToken     = token;
            }

            reader.Close();

            if (tableCount < database.Tables.Count)
            {
                tableCount = database.Tables.Count;
                OnProgress(tableCount, database.Tables.Count, "Restore completed!");
            }

            // Uppdatera databasen till senaste versionen
            //RunSqlUpdateCommands(CollectSqlUpdateDatabase(false));
        }
Пример #3
0
        public void CreateBackup2(string fullPath)
        {
            // Current version of backup system
            int backupVersion = 2;

            string sql             = "select top 1 [DatabaseVersion] from [EasyBaseSystems]";
            int    databaseVersion = Convert.ToInt32(Connection.GetScalar(sql));

            if (databaseVersion != DatabaseDefinition.DatabaseVersion)
            {
                throw new DatabaseVersionException("Wrong database version. The database's version is " + databaseVersion + ", but the current version of the application is " + DatabaseDefinition.DatabaseVersion + ". Backup is not possible.");
            }

            DatabaseSchema savedDatabase = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(DatabaseDefinition.DatabaseVersion));

            long totalRowsInDB = 0;

            sql = "select (";
            string plus = "";

            foreach (TableSchema table in savedDatabase.Tables)
            {
                sql  = sql + plus + "(select count(*) from [" + table.TableName + "])";
                plus = "+";
            }

            sql += ")";

            totalRowsInDB = Convert.ToInt64(Connection.GetScalar(sql));

            StreamWriter streamWriter = new StreamWriter(fullPath);

            streamWriter.Write("[" + backupVersion + ";" + CurrentApplication.Name + ";" + DatabaseDefinition.DatabaseVersion + ";" + totalRowsInDB + "]");

            foreach (TableSchema table in savedDatabase.Tables)
            {
                StringBuilder commaSeparatedFields = new StringBuilder();
                string        comma = "";
                foreach (FieldSchema field in table.DatabaseFields)
                {
                    commaSeparatedFields.Append(comma + "[" + field.FieldName + "]");
                    comma = ", ";
                }

                sql = "select " + commaSeparatedFields + " from [" + table.TableName + "]";
                DataTable dataTable = new DataTable();

                Connection.GetTable(dataTable, sql);

                streamWriter.Write("[" + table.TableName + ";" + dataTable.Rows.Count + "]");

                if (dataTable.Rows.Count > 0)
                {
                    foreach (FieldSchema field in table.DatabaseFields)
                    {
                        streamWriter.Write("[" + field.FieldName + "]");

                        foreach (DataRow dataRow in dataTable.Rows)
                        {
                            string data = field.SerializeData(dataRow[field.FieldName]);
                            streamWriter.Write(data);
                        }
                    }
                }
            }

            streamWriter.Flush();
            streamWriter.Close();
        }
Пример #4
0
        public void RestoreBackup(string fullPath, int toDatabaseVersion)
        {
            var reader = new StreamReader(fullPath);
            var header = new StringBuilder();

            int    backupVersion           = 0;
            int    databaseVersion         = 0;
            string databaseApplicationName = "";
            long   totalRowsInDB           = 0;

            try {
                // Read header
                char token = ' ';
                while (token != ']')
                {
                    token = (char)reader.Read();
                    if (token != '[' && token != ']')
                    {
                        header.Append(token);
                    }
                }

                string[] headerArray = header.ToString().Split(";".ToCharArray());
                backupVersion           = int.Parse(headerArray[0]);
                databaseVersion         = 0;
                databaseApplicationName = "";

                if (backupVersion == 1)
                {
                    databaseVersion = int.Parse(headerArray[1]);
                }
                else
                {
                    databaseApplicationName = headerArray[1];
                    databaseVersion         = int.Parse(headerArray[2]);
                    totalRowsInDB           = long.Parse(headerArray[3]);
                }
            }
            catch (Exception ex) {
                throw new BackupException("Backupfilens huvud har ett felaktigt format.", ex);
            }

            if (backupVersion >= 2)
            {
                if (databaseApplicationName != CurrentApplication.Name)
                {
                    throw new BackupException("Den aktuella backupen tillhör inte det här programmet. Backupen är en backup för programmet \"" + databaseApplicationName + "\".");
                }
            }

            // Create database
            var database = new DatabaseSchema(DatabaseDefinition.GetDatabaseXmlDefinition(databaseVersion));

            CreateDatabaseNoConstraints(databaseVersion);

            // Call function that reads all table contents from the backup file.
            switch (backupVersion)
            {
            case 1:
                RestoreBackup1(reader, database, backupVersion);
                break;

            case 2:
                RestoreBackup2(reader, database, backupVersion, totalRowsInDB);
                break;

            default:
                throw new NotImplementedException("Backup version " + backupVersion + " is not implemented.");
            }

            // Efter inläsning, uppdatera databasen till senaste versionen
            RunSqlUpdateCommands(CollectSqlUpdateDatabase(false, toDatabaseVersion));
        }
Пример #5
0
        public static string[] GetCreateSqlScript()
        {
            DatabaseSchema database = new DatabaseSchema(GetDatabaseDefinitionXml());

            return(database.GenerateSqlCreate());
        }