gongqiuhong hai 10 meses
pai
achega
12b045d91a
Modificáronse 2 ficheiros con 181 adicións e 144 borrados
  1. 10 2
      DbBackup/Form1.cs
  2. 171 142
      Oracle11/DbHelper.cs

+ 10 - 2
DbBackup/Form1.cs

@@ -70,7 +70,15 @@ namespace DbBackup
                           var allFile = txtAllFile.Text.Trim();
                           Info("开始增量备份...");
                           var zipFile = DbHelper.BackupIncrementDb(allFile, dbAddr, user, pwd, service);//增量备份
-                          Info($"增量备份完成,文件={zipFile}");
+                          if (zipFile == null)
+                          {
+                              Info($"数据未作改变,不进行增量备份");
+                          }
+                          else
+                          {
+                              Info($"增量备份完成,文件={zipFile}");
+                          }
+
                       }
                       catch (Exception ex)
                       {
@@ -212,7 +220,7 @@ namespace DbBackup
 
         private void ClearNoneZipFile()
         {
-            var files=Directory.GetFiles("Backup");
+            var files = Directory.GetFiles("Backup");
             foreach (var item in files)
             {
                 if (!item.ToUpper().EndsWith("7Z"))

+ 171 - 142
Oracle11/DbHelper.cs

@@ -375,157 +375,163 @@ namespace Oracle11
         /// <param name="serviceName"></param>
         public static void RestoreDb(string dbZipFile, string dbAddr, string user, string pwd, string sysPwd, string serviceName = "orcl")
         {
-            FileInfo f = new FileInfo(dbZipFile);
-            dbZipFile = f.FullName;
-            user = user.ToUpper();
-
-            CreateUserIfNotExit(dbAddr, user, pwd, sysPwd, serviceName);
-            var dir = SevenZipUtil.UnZipFile(dbZipFile);
-            string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
-            var sequences = File.ReadAllText(Path.Combine(dir, "sequences.sql"));
-            var triggers = File.ReadAllText(Path.Combine(dir, "triggers.sql"));
-            var tables = File.ReadAllText(Path.Combine(dir, "tables.sql"));
-            var indexes = File.ReadAllText(Path.Combine(dir, "indexes.sql"));
-
-            var seqsDic = GetAllSequenceSql(dbAddr, user, pwd, serviceName);
-            var tablesDic = GetAllTableSql(dbAddr, user, pwd, serviceName);
-            var triggersDic = GetAllTriggerSql(dbAddr, user, pwd, serviceName);
-            var indexesDic = GetAllIndexSql(dbAddr, user, pwd, serviceName);
-            foreach (var item in sequences.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
-            {
-                string name = FindTextName(item, "-- 创建序列");
-                if (seqsDic.ContainsKey(name)) continue;
-                OracleHelper.ExecuteNonQuery(connString, item);
-            }
-            foreach (var item in tables.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
-            {
-                string name = FindTextName(item, "-- 创建表");
-                if (tablesDic.ContainsKey(name)) continue;
-                OracleHelper.ExecuteNonQuery(connString, item);
-            }
-            foreach (var item in triggers.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
-            {
-                string name = FindTextName(item, "-- 创建触发器");
-                if (triggersDic.ContainsKey(name)) continue;
-                OracleHelper.ExecuteNonQuery(connString, item);
-            }
-            foreach (var item in indexes.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
+            try
             {
-                //唯一索引在创建表时会自动创建,这里只需要创建普通索引
-                string name = FindTextName(item, "-- 创建索引");
-                if (indexesDic.ContainsKey(name)) continue;
-                OracleHelper.ExecuteNonQuery(connString, item);
-            }
-            DisableAllFk(dbAddr, connString, pwd, serviceName);//导入数据前禁用所有外键约束
-            DisableAllTrigger(dbAddr, connString, pwd, serviceName);//导入数据前禁用所有触发器
-            var datFiles = Directory.GetFiles(dir, "*.dat");
-            foreach (var item in datFiles)
-            {
-                var con = new OracleConnection(connString);
-                con.Open();
-                var trans = con.BeginTransaction();
-                try
+                FileInfo f = new FileInfo(dbZipFile);
+                dbZipFile = f.FullName;
+                user = user.ToUpper();
+                ClearUserObj(dbAddr, user, sysPwd, serviceName);
+                CreateUserIfNotExit(dbAddr, user, pwd, sysPwd, serviceName);
+                var dir = SevenZipUtil.UnZipFile(dbZipFile);
+                string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
+                var sequences = File.ReadAllText(Path.Combine(dir, "sequences.sql"));
+                var triggers = File.ReadAllText(Path.Combine(dir, "triggers.sql"));
+                var tables = File.ReadAllText(Path.Combine(dir, "tables.sql"));
+                var indexes = File.ReadAllText(Path.Combine(dir, "indexes.sql"));
+                var seqsDic = GetAllSequenceSql(dbAddr, user, pwd, serviceName);
+                var tablesDic = GetAllTableSql(dbAddr, user, pwd, serviceName);
+                var triggersDic = GetAllTriggerSql(dbAddr, user, pwd, serviceName);
+                var indexesDic = GetAllIndexSql(dbAddr, user, pwd, serviceName);
+                foreach (var item in sequences.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
                 {
-                    string tableName = Path.GetFileNameWithoutExtension(item);
-                    using (BinaryReader br = new BinaryReader(new FileStream(item, FileMode.Open), Encoding.UTF8))
+                    string name = FindTextName(item, "-- 创建序列");
+                    if (seqsDic.ContainsKey(name)) continue;
+                    OracleHelper.ExecuteNonQuery(connString, item);
+                }
+                foreach (var item in tables.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
+                {
+                    string name = FindTextName(item, "-- 创建表");
+                    if (tablesDic.ContainsKey(name)) continue;
+                    OracleHelper.ExecuteNonQuery(connString, item);
+                }
+                foreach (var item in triggers.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
+                {
+                    string name = FindTextName(item, "-- 创建触发器");
+                    if (triggersDic.ContainsKey(name)) continue;
+                    OracleHelper.ExecuteNonQuery(connString, item);
+                }
+                foreach (var item in indexes.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
+                {
+                    //唯一索引在创建表时会自动创建,这里只需要创建普通索引
+                    string name = FindTextName(item, "-- 创建索引");
+                    if (indexesDic.ContainsKey(name)) continue;
+                    OracleHelper.ExecuteNonQuery(connString, item);
+                }
+                DisableAllFk(dbAddr, user, pwd, serviceName);//导入数据前禁用所有外键约束
+                DisableAllTrigger(dbAddr, user, pwd, serviceName);//导入数据前禁用所有触发器
+                var datFiles = Directory.GetFiles(dir, "*.dat");
+                foreach (var item in datFiles)
+                {
+                    var con = new OracleConnection(connString);
+                    con.Open();
+                    var trans = con.BeginTransaction();
+                    try
                     {
-                        if (br.BaseStream.Position >= br.BaseStream.Length) continue;
-                        int columnCount = br.ReadInt32();
-
-                        while (br.BaseStream.Position < br.BaseStream.Length)
+                        string tableName = Path.GetFileNameWithoutExtension(item);
+                        using (BinaryReader br = new BinaryReader(new FileStream(item, FileMode.Open), Encoding.UTF8))
                         {
-                            StringBuilder sb = new StringBuilder();
-                            sb.Append($"insert into {tableName} values(");
-                            OracleParameter[] parameters = new OracleParameter[columnCount];
-                            for (int i = 0; i < columnCount; i++)
+                            if (br.BaseStream.Position >= br.BaseStream.Length) continue;
+                            int columnCount = br.ReadInt32();
+
+                            while (br.BaseStream.Position < br.BaseStream.Length)
                             {
-                                parameters[i] = new OracleParameter();
-                                parameters[i].ParameterName = $"val{i}";
-                                if (i != 0)
-                                    sb.Append(",");
-                                sb.Append($":val{i}");
-                                var colType = br.ReadByte();
-                                if (colType == 100)//DBNull.Value
-                                {
-                                    parameters[i].Value = null;
-                                }
-                                if (colType == 0)//string
-                                {
-                                    var val = br.ReadString();
-                                    parameters[i].Value = val;
-                                }
-                                else if (colType == 1)//DateTime
-                                {
-                                    var val = br.ReadInt64();
-                                    var time = DateTime.FromBinary(val);
-                                    parameters[i].Value = time;
-                                }
-                                else if (colType == 2)//long
-                                {
-                                    var val = br.ReadInt64();
-                                    parameters[i].Value = val;
-                                }
-                                else if (colType == 3)//int
-                                {
-                                    var val = br.ReadInt32();
-                                    parameters[i].Value = val;
-                                }
-                                else if (colType == 4)//short
-                                {
-                                    var val = br.ReadInt16();
-                                    parameters[i].Value = val;
-                                }
-                                else if (colType == 5)//byte
-                                {
-                                    var val = br.ReadByte();
-                                    parameters[i].Value = val;
-                                }
-                                else if (colType == 6)//decimal
-                                {
-                                    var val = br.ReadDecimal();
-                                    parameters[i].Value = val;
-                                }
-                                else if (colType == 7)//float
-                                {
-                                    var val = br.ReadSingle();
-                                    parameters[i].Value = val;
-                                }
-                                else if (colType == 8)//double
-                                {
-                                    var val = br.ReadDouble();
-                                    parameters[i].Value = val;
-                                }
-                                else if (colType == 9)//byte[]
-                                {
-                                    var len = br.ReadInt32();
-                                    var val = br.ReadBytes(len);
-                                    parameters[i].Value = val;
+                                StringBuilder sb = new StringBuilder();
+                                sb.Append($"insert into {tableName} values(");
+                                OracleParameter[] parameters = new OracleParameter[columnCount];
+                                for (int i = 0; i < columnCount; i++)
+                                {
+                                    parameters[i] = new OracleParameter();
+                                    parameters[i].ParameterName = $"val{i}";
+                                    if (i != 0)
+                                        sb.Append(",");
+                                    sb.Append($":val{i}");
+                                    var colType = br.ReadByte();
+                                    if (colType == 100)//DBNull.Value
+                                    {
+                                        parameters[i].Value = null;
+                                    }
+                                    if (colType == 0)//string
+                                    {
+                                        var val = br.ReadString();
+                                        parameters[i].Value = val;
+                                    }
+                                    else if (colType == 1)//DateTime
+                                    {
+                                        var val = br.ReadInt64();
+                                        var time = DateTime.FromBinary(val);
+                                        parameters[i].Value = time;
+                                    }
+                                    else if (colType == 2)//long
+                                    {
+                                        var val = br.ReadInt64();
+                                        parameters[i].Value = val;
+                                    }
+                                    else if (colType == 3)//int
+                                    {
+                                        var val = br.ReadInt32();
+                                        parameters[i].Value = val;
+                                    }
+                                    else if (colType == 4)//short
+                                    {
+                                        var val = br.ReadInt16();
+                                        parameters[i].Value = val;
+                                    }
+                                    else if (colType == 5)//byte
+                                    {
+                                        var val = br.ReadByte();
+                                        parameters[i].Value = val;
+                                    }
+                                    else if (colType == 6)//decimal
+                                    {
+                                        var val = br.ReadDecimal();
+                                        parameters[i].Value = val;
+                                    }
+                                    else if (colType == 7)//float
+                                    {
+                                        var val = br.ReadSingle();
+                                        parameters[i].Value = val;
+                                    }
+                                    else if (colType == 8)//double
+                                    {
+                                        var val = br.ReadDouble();
+                                        parameters[i].Value = val;
+                                    }
+                                    else if (colType == 9)//byte[]
+                                    {
+                                        var len = br.ReadInt32();
+                                        var val = br.ReadBytes(len);
+                                        parameters[i].Value = val;
+                                    }
                                 }
+                                sb.Append(")");
+                                var insertSql = sb.ToString();
+                                OracleHelper.BatchInsert(con, trans, insertSql, parameters);
+                                //OracleHelper.ExecuteNonQuery(connString, insertSql, parameters);
                             }
-                            sb.Append(")");
-                            var insertSql = sb.ToString();
-                            OracleHelper.BatchInsert(con, trans, insertSql, parameters);
-                            //OracleHelper.ExecuteNonQuery(connString, insertSql, parameters);
                         }
+                        trans.Commit();
+                        con.Dispose();
+                    }
+                    catch (Exception ex)
+                    {
+                        trans.Rollback();
+                        throw;
                     }
-                    trans.Commit();
-                    con.Dispose();
                 }
-                catch (Exception ex)
+                EnableAllFk(dbAddr, user, pwd, serviceName);//导入数据后启用所有外键约束
+                EnableAllTrigger(dbAddr, user, pwd, serviceName);//导入数据后启用所有触发器
+                var delFile = Directory.GetFiles(dir);
+                foreach (var item in delFile)
                 {
-                    trans.Rollback();
-                    throw;
+                    if (item.ToUpper().EndsWith(".DAT") || item.ToUpper().EndsWith(".SQL") || item.ToUpper().EndsWith(".TXT"))
+                    {
+                        File.Delete(item);
+                    }
                 }
             }
-            EnableAllFk(dbAddr, connString, pwd, serviceName);//导入数据后启用所有外键约束
-            EnableAllTrigger(dbAddr, connString, pwd, serviceName);//导入数据后启用所有触发器
-            var delFile = Directory.GetFiles(dir);
-            foreach (var item in delFile)
+            finally
             {
-                if (item.ToUpper().EndsWith(".DAT") || item.ToUpper().EndsWith(".SQL") || item.ToUpper().EndsWith(".TXT"))
-                {
-                    File.Delete(item);
-                }
+                OracleConnection.ClearAllPools();
             }
         }
 
@@ -545,7 +551,8 @@ namespace Oracle11
             dbZipFile = file.FullName;
             var dir = SevenZipUtil.UnZipFile(dbZipFile);
             string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
-            DisableAllFk(dbAddr, connString, pwd, serviceName);//导入数据前禁用所有外键约束
+            DisableAllFk(dbAddr, user, pwd, serviceName);//导入数据前禁用所有外键约束
+            DisableAllTrigger(dbAddr, user, pwd, serviceName);//导入数据前禁用所有触发器
             var datFiles = Directory.GetFiles(dir, "*.dat");
             var maxInfo = Path.Combine(dir, "MaxInfo-Increment.txt");
             var maxArr = File.ReadAllLines(maxInfo);
@@ -662,8 +669,8 @@ namespace Oracle11
                     throw;
                 }
             }
-            EnableAllFk(dbAddr, connString, pwd, serviceName);//导入数据后启用所有外键约束
-
+            EnableAllFk(dbAddr, user, pwd, serviceName);//导入数据后启用所有外键约束
+            EnableAllTrigger(dbAddr, user, pwd, serviceName);//导入数据后启用所有触发器
             var delFile = Directory.GetFiles(dir);
             foreach (var item in delFile)
             {
@@ -801,7 +808,12 @@ namespace Oracle11
         {
             string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
             var triggers = GetAllTriggerSql(dbAddr, user, pwd, serviceName).Keys.ToList();
-            var sql = string.Join("alter trigger trigger_name enable/", triggers);
+
+            String sql = String.Empty;
+            foreach (var t in triggers)
+            {
+                sql += $"alter trigger {t} enable/";
+            }
             OracleHelper.ExecuteNonQuery(connString, sql);
         }
 
@@ -810,10 +822,27 @@ namespace Oracle11
         {
             string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
             var triggers = GetAllTriggerSql(dbAddr, user, pwd, serviceName).Keys.ToList();
-            var sql = string.Join("alter trigger trigger_name disable/", triggers);
+            String sql = String.Empty;
+            foreach (var t in triggers)
+            {
+                sql += $"alter trigger {t} disable/";
+            }
             OracleHelper.ExecuteNonQuery(connString, sql);
         }
+        //删除用户信息
+        private static void ClearUserObj(string dbAddr, string deluser, string sysPwd, string serviceName = "orcl")
+        {
+            string connString = $"Data Source={dbAddr}/orcl; User Id=SYS; Password={sysPwd};DBA Privilege=SYSDBA;";
 
+            //1.创建用户
+            string sql = "SELECT username FROM dba_users WHERE username = :username";
+            var userObj = OracleHelper.ExecuteScalar(connString, sql,
+              new OracleParameter("username", deluser));
+            if (userObj != null)
+            {
+                OracleHelper.ExecuteNonQuery(connString, $"drop user {deluser} cascade");
+            }
+        }
         //获取表的主键列名(没有主键返回null)
         private static string GetPkColumn(string tableName, string dbAddr, string user, string pwd, string serviceName = "orcl")
         {