123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883 |
- using Oracle.ManagedDataAccess.Client;
- using SevenZip;
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Data.Common;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Xml.Linq;
- namespace Oracle11
- {
- /// <summary>
- /// 数据库备份还原类(不支持并行调用)
- /// </summary>
- public static class DbHelper
- {
- #region 备份及还原
- /// <summary>
- /// 全量备份(返回一个7z压缩文件)
- /// </summary>
- /// <param name="oracleAddr">oracle地址(127.0.0.1:1521)</param>
- /// <param name="user">用户名(不区分大小写)</param>
- /// <param name="pwd">密码</param>
- /// <param name="serviceName">服务名称(orcl)</param>
- /// <param name="tables">要备份的表名(默认备份所有表)</param>
- public static string BackupDb(string dbAddr, string user, string pwd, string serviceName = "orcl", List<string> tables = null)
- {
- Directory.CreateDirectory("Backup");
- user = user.ToUpper();
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- if (tables == null || tables.Count == 0)
- tables = GetAllTable(dbAddr, user, pwd, serviceName);
- DirectoryInfo dir = new DirectoryInfo("Backup");
- var delFiles = dir.GetFiles();
- foreach (var item in delFiles)
- {
- if (!item.Name.ToUpper().EndsWith(".SQL") && !item.Name.ToUpper().EndsWith(".DAT") && !item.Name.ToUpper().EndsWith(".TXT"))
- continue;
- item.Delete();
- }
- List<string> sqls = new List<string>();
- foreach (var item in tables)
- {
- var sql = $"select dbms_metadata.get_ddl('TABLE','{item}') createTableSql from dual";
- var createTableSql = OracleHelper.ExecuteScalar(connString, sql).ToString();
- createTableSql = createTableSql.Replace("\"", "").Replace($"{user}.", "").Trim().Trim("\n".ToCharArray());
- sqls.Add($"-- ----------------------------\r\n-- 创建表{item}\r\n-- ----------------------------\r\n{createTableSql}");
- }
- sqls = sqls.OrderBy(p => p.ToUpper().Contains("REFERENCES")).ToList();
- File.WriteAllText("Backup\\tables.sql", $"{string.Join("\r\n/\r\n", sqls)}");
- sqls.Clear();
- var seqs = GetAllSequenceSql(dbAddr, user, pwd, serviceName);
- foreach (var item in seqs)
- {
- var sql = item.Value.Replace("\"", "").Replace($"{user}.", "").Trim().Trim("\n".ToCharArray());
- sqls.Add($"-- ----------------------------\r\n-- 创建序列{item.Key}\r\n-- ----------------------------\r\n{sql}");
- }
- File.WriteAllText("Backup\\sequences.sql", $"{string.Join("\r\n/\r\n", sqls)}");
- sqls.Clear();
- var triggers = GetAllTriggerSql(dbAddr, user, pwd, serviceName);
- foreach (var item in triggers)
- {
- var sql = item.Value.Replace("\"", "").Replace($"{user}.", "")
- .Replace($"ALTER TRIGGER {item.Key} ENABLE", "").Trim().Trim("\n".ToCharArray());
- sqls.Add($"-- ----------------------------\r\n-- 创建触发器{item.Key}\r\n-- ----------------------------\r\n{sql}");
- }
- File.WriteAllText("Backup\\triggers.sql", $"{string.Join("\r\n/\r\n", sqls)}");
- sqls.Clear();
- var indexs = GetAllIndexSql(dbAddr, user, pwd, serviceName);
- foreach (var item in indexs)
- {
- var sql = item.Value.Replace("\"", "").Replace($"{user}.", "").Trim().Trim("\n".ToCharArray());
- sqls.Add($"-- ----------------------------\r\n-- 创建索引{item.Key}\r\n-- ----------------------------\r\n{sql}");
- }
- File.WriteAllText("Backup\\indexes.sql", $"{string.Join("\r\n/\r\n", sqls)}");
- sqls.Clear();
- foreach (var item in tables)
- {
- var pkColumn = GetPkColumn(item, dbAddr, user, pwd, serviceName);
- if (!string.IsNullOrWhiteSpace(pkColumn))
- {
- var pkMax = GetMaxPk(item, pkColumn, dbAddr, user, pwd, serviceName);
- if (string.IsNullOrWhiteSpace(pkMax))
- pkMax = "0";
- File.AppendAllText("Backup\\MaxInfo.txt", $"{item} {pkColumn} {pkMax}\r\n");
- }
- var sql = $"select * from {item}";
- var dt = OracleHelper.ExecuteDataTable(connString, sql);
- if (dt.Rows.Count > 0)
- {
- string file = $"Backup\\{item}.dat";
- using (BinaryWriter br = new BinaryWriter(new FileStream(file, FileMode.Create), Encoding.UTF8))
- {
- Dictionary<int, Type> dic = new Dictionary<int, Type>();
- for (int i = 0; i < dt.Columns.Count; i++)
- {
- dic.Add(i, dt.Columns[i].DataType);
- }
- br.Write(dt.Columns.Count);
- foreach (DataRow dr in dt.Rows)
- {
- for (int i = 0; i < dt.Columns.Count; i++)
- {
- if (dr[i] == DBNull.Value)
- {
- br.Write((byte)100);
- }
- else if (dic[i] == typeof(string))
- {
- br.Write((byte)0);
- br.Write(dr[i].ToString());
- }
- else if (dic[i] == typeof(DateTime))
- {
- br.Write((byte)1);
- br.Write(((DateTime)dr[i]).ToBinary());
- }
- else if (dic[i] == typeof(long))
- {
- br.Write((byte)2);
- br.Write((long)dr[i]);
- }
- else if (dic[i] == typeof(int))
- {
- br.Write((byte)3);
- br.Write((int)dr[i]);
- }
- else if (dic[i] == typeof(short))
- {
- br.Write((byte)4);
- br.Write((short)dr[i]);
- }
- else if (dic[i] == typeof(byte))
- {
- br.Write((byte)5);
- br.Write((byte)dr[i]);
- }
- else if (dic[i] == typeof(decimal))
- {
- br.Write((byte)6);
- br.Write(Convert.ToDecimal(dr[i]));
- }
- else if (dic[i] == typeof(float))
- {
- br.Write((byte)7);
- br.Write((float)dr[i]);
- }
- else if (dic[i] == typeof(double))
- {
- br.Write((byte)8);
- br.Write((double)dr[i]);
- }
- else if (dic[i] == typeof(byte[]))
- {
- br.Write((byte)9);
- var data = (byte[])dr[i];
- br.Write(data.Length);
- br.Write(data);
- }
- else
- {
- throw new Exception($"不支持类型{dic[i]}的转换");
- }
- }
- }
- }
- }
- }
- string zipDir = dir.FullName;
- string zipFile = Path.Combine(zipDir, $"all-{DateTime.Now:yyyyMMddHHmmss}.7z");
- SevenZipUtil.ZipLargeFiles(zipDir, zipFile, new string[] { "*.sql", "*.dat", "*.txt" }, true);
- return zipFile;
- }
- /// <summary>
- /// 增量备份(返回一个7z压缩文件)
- /// </summary>
- /// <param name="backup7zFile">全量备份的文件</param>
- /// <param name="dbAddr">oracle地址(127.0.0.1:1521</param>
- /// <param name="user">用户名(不区分大小写)</param>
- /// <param name="pwd">密码</param>
- /// <param name="serviceName">服务名称(orcl)</param>
- /// <param name="tables">>要备份的表名(默认备份所有表)</param>
- public static string BackupIncrementDb(string backup7zFile, string dbAddr, string user, string pwd, string serviceName = "orcl", List<string> tables = null)
- {
- string prefix = Path.GetFileNameWithoutExtension(backup7zFile);
- FileInfo f = new FileInfo(backup7zFile);
- string dirString = f.DirectoryName;
- user = user.ToUpper();
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- if (tables == null || tables.Count == 0)
- tables = GetAllTable(dbAddr, user, pwd, serviceName);
- DirectoryInfo dir = new DirectoryInfo(dirString);
- var delFiles = dir.GetFiles();
- foreach (var item in delFiles)
- {
- if (!item.Name.ToUpper().EndsWith(".SQL") && !item.Name.ToUpper().EndsWith(".DAT") && !item.Name.ToUpper().EndsWith(".TXT"))
- continue;
- item.Delete();
- }
- //获取全量备份的文件和其相关的增量备份文件 fileName like [all-20240926104545] or [all-20240926104545-Increment-20240926150000]
- var fileNames = Directory.GetFiles(dirString, "*.7z").Where(p => Path.GetFileNameWithoutExtension(p).StartsWith(prefix)).Select(p => Path.GetFileNameWithoutExtension(p));
- //获取最后一个备份的文件
- var maxFileName = fileNames.OrderByDescending(p =>
- {
- var idx = p.LastIndexOf("-");
- var time = DateTime.ParseExact(p.Substring(idx + 1, 14), "yyyyMMddHHmmss", null);
- return time;
- }).FirstOrDefault();
- var maxFile = Path.Combine(dirString, maxFileName + ".7z");
- SevenZipUtil.UnZipFile(maxFile, "*.txt");
- string maxInfoFile = Path.Combine(dirString, maxFileName.Contains("Increment") ? "MaxInfo-Increment.txt" : "MaxInfo.txt");
- bool hasNew = false;
- if (File.Exists(maxInfoFile))
- {
- var lines = File.ReadAllLines(maxInfoFile);
- File.WriteAllText(maxInfoFile, "");
- foreach (var item in lines)
- {
- var arr = item.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
- var tbName = arr[0];
- var colName = arr[1];
- var maxPk = arr[2];
- string sql = $"select * from {tbName} where {colName}>{maxPk}";
- var dt = OracleHelper.ExecuteDataTable(connString, sql);
- if (dt.Rows.Count > 0)
- {
- hasNew = true;
- sql = $"select max({colName}) from {tbName}";
- var maxPkNew = OracleHelper.ExecuteScalar(connString, sql).ToString();
- File.AppendAllText(Path.Combine(dirString, "MaxInfo-Increment.txt"), $"{tbName} {colName} {maxPkNew}\r\n");
- string file = Path.Combine(dirString, $"{tbName}-Increment.dat");
- using (BinaryWriter br = new BinaryWriter(new FileStream(file, FileMode.Create), Encoding.UTF8))
- {
- Dictionary<int, Type> dic = new Dictionary<int, Type>();
- for (int i = 0; i < dt.Columns.Count; i++)
- {
- dic.Add(i, dt.Columns[i].DataType);
- }
- br.Write(dt.Columns.Count);
- foreach (DataRow dr in dt.Rows)
- {
- for (int i = 0; i < dt.Columns.Count; i++)
- {
- if (dr[i] == DBNull.Value)
- {
- br.Write((byte)100);
- }
- else if (dic[i] == typeof(string))
- {
- br.Write((byte)0);
- br.Write(dr[i].ToString());
- }
- else if (dic[i] == typeof(DateTime))
- {
- br.Write((byte)1);
- br.Write(((DateTime)dr[i]).ToBinary());
- }
- else if (dic[i] == typeof(long))
- {
- br.Write((byte)2);
- br.Write((long)dr[i]);
- }
- else if (dic[i] == typeof(int))
- {
- br.Write((byte)3);
- br.Write((int)dr[i]);
- }
- else if (dic[i] == typeof(short))
- {
- br.Write((byte)4);
- br.Write((short)dr[i]);
- }
- else if (dic[i] == typeof(byte))
- {
- br.Write((byte)5);
- br.Write((byte)dr[i]);
- }
- else if (dic[i] == typeof(decimal))
- {
- br.Write((byte)6);
- br.Write(Convert.ToDecimal(dr[i]));
- }
- else if (dic[i] == typeof(float))
- {
- br.Write((byte)7);
- br.Write((float)dr[i]);
- }
- else if (dic[i] == typeof(double))
- {
- br.Write((byte)8);
- br.Write((double)dr[i]);
- }
- else if (dic[i] == typeof(byte[]))
- {
- br.Write((byte)9);
- var data = (byte[])dr[i];
- br.Write(data.Length);
- br.Write(data);
- }
- else
- {
- throw new Exception($"不支持类型{dic[i]}的转换");
- }
- }
- }
- }
- }
- else
- {
- File.AppendAllText(Path.Combine(dirString, "MaxInfo-Increment.txt"), $"{tbName} {colName} {maxPk}\r\n");
- }
- }
- }
- string zipFile = null;
- if (hasNew)
- {
- zipFile = Path.Combine(dirString, $"{prefix}-Increment-{DateTime.Now:yyyyMMddHHmmss}.7z");
- SevenZipUtil.ZipLargeFiles(dirString, zipFile, new string[] { "*Increment.dat", "*Increment.txt" }, true);
- }
- dir = new DirectoryInfo(dirString);
- delFiles = dir.GetFiles();
- foreach (var item in delFiles)
- {
- if (!item.Name.ToUpper().EndsWith(".SQL") && !item.Name.ToUpper().EndsWith(".DAT") && !item.Name.ToUpper().EndsWith(".TXT"))
- continue;
- item.Delete();
- }
- return zipFile;
- }
- /// <summary>
- /// 获取用户下所有表
- /// </summary>
- /// <param name="dbAddr">数据库地址(127.0.0.1:1521)</param>
- /// <param name="user">用户名(不区分大小写)</param>
- /// <param name="pwd">密码</param>
- /// <param name="serviceName">服务名称(orcl)</param>
- /// <returns></returns>
- public static List<string> GetAllTable(string dbAddr, string user, string pwd, string serviceName = "orcl")
- {
- user = user.ToUpper();
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- var table = OracleHelper.ExecuteDataTable(connString, $"select table_name from all_tables where owner = '{user}'");
- var list = table.TableToListBcl<string>();
- return list;
- }
- /// <summary>
- /// 从全量备份压缩文件中还原数据库
- /// </summary>
- /// <param name="dbZipFile"></param>
- /// <param name="dbAddr"></param>
- /// <param name="user"></param>
- /// <param name="pwd"></param>
- /// <param name="sysPwd"></param>
- /// <param name="serviceName"></param>
- public static void RestoreDb(string dbZipFile, string dbAddr, string user, string pwd, string sysPwd, string serviceName = "orcl")
- {
- 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 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
- {
- string tableName = Path.GetFileNameWithoutExtension(item);
- using (BinaryReader br = new BinaryReader(new FileStream(item, FileMode.Open), Encoding.UTF8))
- {
- if (br.BaseStream.Position >= br.BaseStream.Length) continue;
- int columnCount = br.ReadInt32();
- while (br.BaseStream.Position < br.BaseStream.Length)
- {
- 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);
- }
- }
- trans.Commit();
- con.Dispose();
- }
- catch (Exception ex)
- {
- trans.Rollback();
- throw;
- }
- }
- EnableAllFk(dbAddr, user, pwd, serviceName);//导入数据后启用所有外键约束
- EnableAllTrigger(dbAddr, user, pwd, serviceName);//导入数据后启用所有触发器
- var delFile = Directory.GetFiles(dir);
- foreach (var item in delFile)
- {
- if (item.ToUpper().EndsWith(".DAT") || item.ToUpper().EndsWith(".SQL") || item.ToUpper().EndsWith(".TXT"))
- {
- File.Delete(item);
- }
- }
- }
- finally
- {
- OracleConnection.ClearAllPools();
- }
- }
- /// <summary>
- /// 从增量备份压缩文件中恢复数据
- /// </summary>
- /// <param name="dbZipFile"></param>
- /// <param name="dbAddr"></param>
- /// <param name="user"></param>
- /// <param name="pwd"></param>
- /// <param name="sysPwd"></param>
- /// <param name="serviceName"></param>
- public static void RestoreIncrementDb(string dbZipFile, string dbAddr, string user, string pwd, string sysPwd, string serviceName = "orcl")
- {
- user = user.ToUpper();
- FileInfo file = new FileInfo(dbZipFile);
- dbZipFile = file.FullName;
- var dir = SevenZipUtil.UnZipFile(dbZipFile);
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- 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);
- List<(string, string, string)> list = new List<(string, string, string)>();
- foreach (var item in maxArr)
- {
- var arr = item.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
- var tbName = arr[0];
- var colName = arr[1];
- var maxPk = arr[2];
- list.Add((tbName, colName, maxPk));
- }
- foreach (var item in datFiles)
- {
- string tableName = Path.GetFileNameWithoutExtension(item).Replace("-Increment", "");
- var tupItem = list.First(p => p.Item1 == tableName);
- string maxSql = $"select max({tupItem.Item2}) from {tupItem.Item1}";
- var maxObj = OracleHelper.ExecuteScalar(connString, maxSql);
- if (maxObj != DBNull.Value && Convert.ToInt64(maxObj) >= Convert.ToInt64(tupItem.Item3))
- continue;//数据已存在,不要重复导入
- var con = new OracleConnection(connString);
- con.Open();
- var trans = con.BeginTransaction();
- try
- {
- using (BinaryReader br = new BinaryReader(new FileStream(item, FileMode.Open), Encoding.UTF8))
- {
- if (br.BaseStream.Position >= br.BaseStream.Length) continue;
- int columnCount = br.ReadInt32();
- while (br.BaseStream.Position < br.BaseStream.Length)
- {
- 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);
- }
- }
- trans.Commit();
- con.Dispose();
- }
- catch
- {
- trans.Rollback();
- throw;
- }
- }
- EnableAllFk(dbAddr, user, pwd, serviceName);//导入数据后启用所有外键约束
- EnableAllTrigger(dbAddr, user, pwd, serviceName);//导入数据后启用所有触发器
- var delFile = Directory.GetFiles(dir);
- foreach (var item in delFile)
- {
- if (item.ToUpper().EndsWith(".DAT") || item.ToUpper().EndsWith(".SQL") || item.ToUpper().EndsWith(".TXT"))
- {
- File.Delete(item);
- }
- }
- }
- #endregion
- #region 数据库连接测试
- /// <summary>
- /// 测试数据库连接
- /// </summary>
- /// <param name="oracleAddr">oracle地址(127.0.0.1:1521)</param>
- /// <param name="user">用户名(不区分大小写)</param>
- /// <param name="pwd">密码</param>
- /// <param name="serviceName">服务名称(orcl)</param>
- public static void TestConnection(string dbAddr, string user, string pwd, string serviceName = "orcl")
- {
- Directory.CreateDirectory("Backup");
- user = user.ToUpper();
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- OracleHelper.TestConnection(connString);
- }
- /// <summary>
- /// 测试数据库连接
- /// </summary>
- /// <param name="oracleAddr">oracle地址(127.0.0.1:1521)</param>
- /// <param name="sysPwd">SYS账户密码</param>
- /// <param name="serviceName">服务名称(orcl)</param>
- public static void TestSysConnection(string dbAddr, string sysPwd, string serviceName = "orcl")
- {
- Directory.CreateDirectory("Backup");
- string connString = $"Data Source={dbAddr}/orcl; User Id=SYS; Password={sysPwd};DBA Privilege=SYSDBA;";
- OracleHelper.TestConnection(connString);
- }
- #endregion
- #region private function
- //创建用户并授权
- private static void CreateUserIfNotExit(string dbAddr, string user, string pwd, string sysPwd, string serviceName = "orcl")
- {
- user = user.ToUpper();
- 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", user));
- if (userObj == null)
- {
- sql = $"create user {user} identified by {pwd} default tablespace USERS temporary tablespace TEMP profile DEFAULT password expire";
- OracleHelper.ExecuteNonQuery(connString, sql);
- }
- //2.给用户权限
- sql = $"grant dba to {user}";
- OracleHelper.ExecuteNonQuery(connString, sql);
- sql = $"grant create session to {user}";
- OracleHelper.ExecuteNonQuery(connString, sql);
- sql = $"grant unlimited tablespace to {user}";
- OracleHelper.ExecuteNonQuery(connString, sql);
- //新用户需要修改一次密码才能登录
- sql = $"alter user {user} identified by {pwd} account unlock";
- OracleHelper.ExecuteNonQuery(connString, sql);
- }
- //获取用户下所有表创建SQL
- private static Dictionary<string, string> GetAllTableSql(string dbAddr, string user, string pwd, string serviceName = "orcl")
- {
- user = user.ToUpper();
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- var table = OracleHelper.ExecuteDataTable(connString, $"select table_name,DBMS_METADATA.GET_DDL('TABLE',table_name) FROM all_tables where owner='{user}'");
- return table.TableToDictionary();
- }
- //获取用户下所有序列创建SQL
- private static Dictionary<string, string> GetAllSequenceSql(string dbAddr, string user, string pwd, string serviceName = "orcl")
- {
- user = user.ToUpper();
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- var table = OracleHelper.ExecuteDataTable(connString, $"select sequence_name,DBMS_METADATA.GET_DDL('SEQUENCE',sequence_name) FROM all_sequences where sequence_owner='{user}'");
- return table.TableToDictionary();
- }
- //获取用户下所有触发器创建SQL
- private static Dictionary<string, string> GetAllTriggerSql(string dbAddr, string user, string pwd, string serviceName = "orcl")
- {
- user = user.ToUpper();
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- var table = OracleHelper.ExecuteDataTable(connString, $"select trigger_name,DBMS_METADATA.GET_DDL('TRIGGER',trigger_name) FROM all_triggers where owner='{user}'");
- return table.TableToDictionary();
- }
- //获取用户下所有索引创建SQL(不含唯一索引)
- private static Dictionary<string, string> GetAllIndexSql(string dbAddr, string user, string pwd, string serviceName = "orcl")
- {
- user = user.ToUpper();
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- string sql = $"select index_name,DBMS_METADATA.GET_DDL('INDEX', index_name ) FROM all_indexes WHERE owner = '{user}' AND index_name IN( SELECT user_ind_columns.index_name FROM user_ind_columns, user_indexes WHERE user_ind_columns.index_name = user_indexes.index_name AND user_indexes.uniqueness = 'NONUNIQUE' )";
- var table = OracleHelper.ExecuteDataTable(connString, sql);
- return table.TableToDictionary();
- }
- //启用据库所有外键约束
- private static void EnableAllFk(string dbAddr, string user, string pwd, string serviceName = "orcl")
- {
- user = user.ToUpper();
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- string sql = "select 'alter table '||table_name||' enable constraint '||constraint_name from user_constraints where constraint_type='R'";
- var sqls = OracleHelper.ExecuteDataTable(connString, sql).TableToListBcl<string>();
- sql = string.Join("/", sqls);
- OracleHelper.ExecuteNonQuery(connString, sql);
- }
- //禁用据库所有外键约束
- private static void DisableAllFk(string dbAddr, string user, string pwd, string serviceName = "orcl")
- {
- user = user.ToUpper();
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- string sql = "select 'alter table '||table_name||' disable constraint '||constraint_name from user_constraints where constraint_type='R'";
- var sqls = OracleHelper.ExecuteDataTable(connString, sql).TableToListBcl<string>();
- sql = string.Join("/", sqls);
- OracleHelper.ExecuteNonQuery(connString, sql);
- }
- //启用据库所有触发器
- private static void EnableAllTrigger(string dbAddr, string user, string pwd, string serviceName = "orcl")
- {
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- var triggers = GetAllTriggerSql(dbAddr, user, pwd, serviceName).Keys.ToList();
- String sql = String.Empty;
- foreach (var t in triggers)
- {
- sql += $"alter trigger {t} enable/";
- }
- OracleHelper.ExecuteNonQuery(connString, sql);
- }
- //禁用据库所有触发器
- private static void DisableAllTrigger(string dbAddr, string user, string pwd, string serviceName = "orcl")
- {
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- var triggers = GetAllTriggerSql(dbAddr, user, pwd, serviceName).Keys.ToList();
- 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")
- {
- user = user.ToUpper();
- tableName = tableName.ToUpper();
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- string sql = $"select column_name from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'P' and au.table_name = '{tableName}' AND au.OWNER='{user}'";
- var columns = OracleHelper.ExecuteDataTable(connString, sql).TableToListBcl<string>();
- return columns.FirstOrDefault();
- }
- private static string GetMaxPk(string tableName, string pkColumn, string dbAddr, string user, string pwd, string serviceName = "orcl")
- {
- user = user.ToUpper();
- tableName = tableName.ToUpper();
- string connString = $"Data Source={dbAddr}/{serviceName}; User Id={user}; Password={pwd};";
- string sql = $"select max({pkColumn}) from {tableName}";
- var valObj = OracleHelper.ExecuteScalar(connString, sql);
- var maxPk = valObj.ToString();
- return maxPk;
- }
- private static string FindTextName(string text, string filter)
- {
- var lines = text.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
- foreach (var line in lines)
- {
- if (line.StartsWith(filter))
- {
- return line.Substring(filter.Length).ToUpper();
- }
- }
- return null;
- }
- #endregion
- }
- }
|