/// <summary>备份一批表到指定压缩文件</summary> /// <param name="tables">数据表集合</param> /// <param name="file">zip压缩文件</param> /// <param name="backupSchema">备份架构</param> /// <returns></returns> public Int32 BackupAll(IList <IDataTable> tables, String file, Boolean backupSchema = true) { if (tables == null) { throw new ArgumentNullException(nameof(tables)); } using var span = Tracer?.NewSpan("db:BackupAll", file); // 过滤不存在的表 var ts = Dal.Tables.Select(e => e.TableName).ToArray(); tables = tables.Where(e => e.TableName.EqualIgnoreCase(ts)).ToList(); var connName = Dal.ConnName; var count = 0; //if (tables == null) tables = Tables; if (tables.Count > 0) { var file2 = file.GetFullPath(); file2.EnsureDirectory(true); WriteLog("备份[{0}]到文件 {1}。{2}", connName, file2, tables.Join(",", e => e.Name)); using var fs = new FileStream(file2, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); using var zip = new ZipArchive(fs, ZipArchiveMode.Create, true, Encoding.UTF8); try { // 备份架构 if (backupSchema) { var xml = DAL.Export(tables); var entry = zip.CreateEntry(connName + ".xml"); using var ms = entry.Open(); ms.Write(xml.GetBytes()); } foreach (var item in tables) { try { var entry = zip.CreateEntry(item.Name + ".table"); using var ms = entry.Open(); Backup(item, ms); count++; } catch (Exception ex) { if (!IgnoreError) { throw; } XTrace.WriteException(ex); } } } catch (Exception ex) { span?.SetError(ex, null); throw; } } return(count); }