|
@@ -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")
|
|
|
{
|