private static float GetBackUpVersion(string connctionString, string backUpFileName) { var ver = (float)0; var line = 0; try { var cn = new SqlConnection(connctionString); line = 1; if (backUpFileName.EndsWith(".NPZ") || backUpFileName.EndsWith(".npz")) { var zp = new Zip(); line = 2; backUpFileName = zp.ExtractTempDIR(backUpFileName); } else if (backUpFileName.EndsWith(".NPZ2") || backUpFileName.EndsWith(".npz2")) { try { line = 3; var pathtemp = Zip.TempDirName(); line = 4; var fileInfo = new FileInfo(backUpFileName); line = 5; pathtemp = Path.Combine(pathtemp, fileInfo.Name); line = 6; pathtemp = Path.ChangeExtension(pathtemp, ".bak"); line = 7; using (var archive = GZipArchive.Open(backUpFileName)) { line = 8; foreach (var entry in archive.Entries.Where(entry => !entry.IsDirectory)) { line = 9; entry.WriteToFile(pathtemp, new ExtractionOptions() { ExtractFullPath = true, Overwrite = true }); } } line = 10; backUpFileName = pathtemp; } catch { var zp = new Zip(); line = 2000; backUpFileName = zp.ExtractTempDIR(backUpFileName); } } line = 11; if (string.IsNullOrEmpty(backUpFileName)) { return(ver); } line = 12; var command = @"RESTORE HEADERONLY FROM DISK ='" + backUpFileName + "'"; line = 13; using (var sqlCommand = new SqlCommand(command, cn)) { line = 14; cn.Open(); line = 15; var sqlDataReader = sqlCommand.ExecuteReader(); line = 16; while (sqlDataReader.Read()) { line = 17; Console.WriteLine(); line = 18; var d = $"{sqlDataReader["DatabaseVersion"]}"; line = 19; if (string.IsNullOrEmpty(d)) { continue; } line = 20; switch (d) { case "406": ver = 6; break; case "408": ver = (float)6.5; break; case "515": ver = 7; break; case "539": ver = 2000; break; case "611": ver = 2005; break; case "612": ver = 2005; break; case "655": ver = 2008; break; case "661": ver = 2008; break; case "706": ver = 2012; break; case "782": ver = 2014; break; case "869": ver = 2017; break; case "895": ver = 2019; break; case "852": ver = 2016; break; default: ver = 0; break; } line = 21; return(ver); } } } catch (Exception ex) { WebErrorLog.ErrorInstence.StartErrorLog(ex, $"Error In Line{line} With ConnectionString:{connctionString} AND BackUpFileName:{backUpFileName}"); ver = 0; } return(ver); }
public static async Task <ReturnedSaveFuncInfo> ReStoreDbAsync(string connectionString, string pathf, bool autoBackup, ENSource Source) { var ret = new ReturnedSaveFuncInfo(); var cn = new SqlConnection(); try { GC.Collect(); SqlConnection.ClearAllPools(); if (autoBackup) { var dir = Application.StartupPath + "\\NovinPardazBackUp"; if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var file = Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly()?.Location)?.Replace(".exe", "__"); var d = Calendar.MiladiToShamsi(DateTime.Now).Replace("/", "_"); d += "__" + DateTime.Now.Hour + " - " + DateTime.Now.Minute; file += d; var filepath = dir + "\\" + file + ".Bak"; ret.AddReturnedValue(await BackupDbAsync(connectionString, Source, filepath, Guid.NewGuid())); } if (pathf.EndsWith(".NPZ") || pathf.EndsWith(".npz")) { var zp = new Zip(); pathf = zp.ExtractTempDIR(pathf); } else if (pathf.EndsWith(".NPZ2") || pathf.EndsWith(".npz2")) { try { var zp = new CompressFile(); var res = await zp.ExtractTempDIR(pathf); ret.AddReturnedValue(res); if (res.HasError) { return(ret); } pathf = res.value; } catch { var zp = new Zip(); pathf = zp.ExtractTempDIR(pathf); } } var csb = new SqlConnectionStringBuilder(connectionString); var serverConnectionString = connectionString.Replace("Initial Catalog=" + csb.InitialCatalog, "Initial Catalog="); cn = new SqlConnection(serverConnectionString) { ConnectionString = serverConnectionString }; var cmd = new SqlCommand("RESTORE DATABASE [dbName] FROM DISK = N'bkPath' WITH FILE = 1, MOVE N'novin' TO N'dbMDFPath', MOVE N'novin_log' TO N'dbLDFPath', NOUNLOAD, REPLACE, STATS = 5", cn); var dbInfo = new CLSServerDBs(connectionString); var backUpInfo = new DataBaseBackUpInfo(pathf, cn.ConnectionString); cmd.CommandText = cmd.CommandText.Replace("dbName", csb.InitialCatalog); cmd.CommandText = cmd.CommandText.Replace("bkPath", pathf); cmd.CommandText = cmd.CommandText.Replace("novin", backUpInfo.LogicalName); cmd.CommandText = cmd.CommandText.Replace("novin_log", backUpInfo.LogicalName + "_log.ldf"); cmd.CommandText = cmd.CommandText.Replace("dbMDFPath", dbInfo.FileName); cmd.CommandText = cmd.CommandText.Replace("dbLDFPath", dbInfo.FileName.ToLower().Replace(".mdf", "_log.Ldf")); //تایم اوت بالا بردن مجاز است cmd.CommandTimeout = 5 * 60 * 1000;//5 minutes cn.Open(); var temp = cmd.CommandText; cmd.CommandText = "ALTER DATABASE [" + csb.InitialCatalog + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE"; cmd.ExecuteNonQuery(); cmd.CommandText = temp; cmd.ExecuteNonQuery(); // cmd.CommandText = NovinPardaz.Properties.Resources.DatabaseSettings; cmd.CommandText = cmd.CommandText.Replace("dbName", csb.InitialCatalog); cmd.ExecuteNonQuery(); cmd.CommandText = "ALTER DATABASE [" + csb.InitialCatalog + "] SET Multi_USER"; cmd.ExecuteNonQuery(); cn.Close(); SqlConnection.ClearAllPools(); Application.DoEvents(); } catch (SqlException ex) { WebErrorLog.ErrorInstence.StartErrorLog(ex); try { cn.Close(); } catch { } ret.AddReturnedValue(ReturnedState.Error, $"حساب کاربری SQL دسترسی به مسیر نصب برنامه ندارد\r\n{ex.Message }//{ex?.InnerException?.Message ?? ""}"); } catch (Exception ex) { WebErrorLog.ErrorInstence.StartErrorLog(ex); try { cn.Close(); } catch { } ret.AddReturnedValue(ex); } Task.Run(() => SetMultiUser(connectionString)); return(ret); }