/// <summary>从指定压缩文件恢复一批数据到目标库</summary> /// <param name="file">zip压缩文件</param> /// <param name="tables">数据表。为空时从压缩包读取xml模型文件</param> /// <param name="setSchema">是否设置数据表模型,自动建表</param> /// <returns></returns> public IDataTable[] RestoreAll(String file, IDataTable[] tables = null, Boolean setSchema = true) { if (file.IsNullOrEmpty()) { throw new ArgumentNullException(nameof(file)); } //if (tables == null) throw new ArgumentNullException(nameof(tables)); var file2 = file.GetFullPath(); if (!File.Exists(file2)) { return(null); } using var span = Tracer?.NewSpan("db:RestoreAll", file); using var fs = new FileStream(file2, FileMode.Open); using var zip = new ZipArchive(fs, ZipArchiveMode.Read, true, Encoding.UTF8); // 备份架构 if (tables == null) { var entry = zip.Entries.FirstOrDefault(e => e.Name.EndsWithIgnoreCase(".xml")); if (entry != null) { using var ms = entry.Open(); tables = DAL.Import(ms.ToStr()).ToArray(); } } WriteLog("恢复[{0}]从文件 {1}。数据表:{2}", Dal.ConnName, file2, tables?.Join(",", e => e.Name)); if (setSchema) { Dal.SetTables(tables); } try { foreach (var item in tables) { var entry = zip.GetEntry(item.Name + ".table"); if (entry != null && entry.Length > 0) { try { using var ms = entry.Open(); Restore(ms, item); } catch (Exception ex) { if (!IgnoreError) { throw; } XTrace.WriteException(ex); } } } } catch (Exception ex) { span?.SetError(ex, null); throw; } return(tables); }