代码基于.net 8开发,达梦数据库为V8版本

代码实例

using System;
using System.Diagnostics;
using System.IO;
using System.Text;

namespace DmDmpTool
{
    /// <summary>
    /// 达梦 dexp 导出、dimp 导入工具类
    /// </summary>
    public class DmExpImpHelper
    {
        #region 配置属性
        /// <summary>达梦bin目录,如D:\\dmdbms\\bin 或 /dmdbms/bin</summary>
        public string DmBinPath { get; set; }
        /// <summary>数据库地址</summary>
        public string Host { get; set; } = "127.0.0.1";
        /// <summary>达梦端口 默认5236</summary>
        public int Port { get; set; } = 5236;
        /// <summary>登录用户</summary>
        public string User { get; set; }
        /// <summary>登录密码</summary>
        public string Pwd { get; set; }
        #endregion

        /// <summary>
        /// 执行外部命令通用方法
        /// </summary>
        /// <param name="exeName">dexp.exe / dimp.exe</param>
        /// <param name="args">命令参数</param>
        /// <param name="outLog">输出日志</param>
        /// <returns>true执行成功,false失败</returns>
        private bool RunCommand(string exeName, string args, out string outLog)
        {
            outLog = string.Empty;
            StringBuilder logSb = new StringBuilder();

            // 拼接完整程序路径
            string fullExePath = Path.Combine(DmBinPath, exeName);
            if (!File.Exists(fullExePath))
            {
                outLog = $"工具不存在:{fullExePath}";
                return false;
            }

            Process process = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = fullExePath,
                    Arguments = args,
                    CreateNoWindow = true, // 不弹出黑窗口
                    UseShellExecute = false,
                    RedirectStandardOutput = true, // 捕获标准输出
                    RedirectStandardError = true,  // 捕获错误输出
                    StandardOutputEncoding = Encoding.GetEncoding("GB2312"), // Windows中文
                    StandardErrorEncoding = Encoding.GetEncoding("GB2312")
                }
            };

            process.OutputDataReceived += (s, e) =>
            {
                if (!string.IsNullOrEmpty(e.Data)) logSb.AppendLine(e.Data);
            };
            process.ErrorDataReceived += (s, e) =>
            {
                if (!string.IsNullOrEmpty(e.Data)) logSb.AppendLine($"【ERROR】{e.Data}");
            };

            process.Start();
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();
            process.WaitForExit(); // 阻塞等待执行完成

            outLog = logSb.ToString();
        
            return process.ExitCode == 0;
        }

        #region 导出 dexp
        /// <summary>
        /// 全库导出
        /// </summary>
        /// <param name="dmpFilePath">dmp完整路径</param>
        /// <param name="logPath">导出日志路径</param>
        /// <param name="compress">是否压缩</param>
        /// <param name="log">执行输出日志</param>
        public bool ExportFullDb(string dmpFilePath, string logPath, bool compress = true, out string log)
        {
            string userId = $"{User}/{Pwd}@{Host}:{Port}";
            StringBuilder argSb = new StringBuilder();
            argSb.Append($"USERID={userId} ");
            argSb.Append($"FILE=\"{dmpFilePath}\" ");
            argSb.Append($"LOG=\"{logPath}\" ");
            argSb.Append("FULL=Y ");
            if (compress) argSb.Append("COMPRESS=Y ");

            string exe = IsLinux() ? "dexp" : "dexp.exe";
            return RunCommand(exe, argSb.ToString(), out log);
        }

        /// <summary>
        /// 按用户导出(单schema)
        /// </summary>
        public bool ExportByOwner(string owner, string dmpFilePath, string logPath, out string log)
        {
            string userId = $"{User}/{Pwd}@{Host}:{Port}";
            string args = $"USERID={userId} FILE=\"{dmpFilePath}\" LOG=\"{logPath}\" OWNER={owner} COMPRESS=Y";
            string exe = IsLinux() ? "dexp" : "dexp.exe";
            return RunCommand(exe, args, out log);
        }

        /// <summary>
        /// 指定表导出
        /// </summary>
        public bool ExportByTables(string[] tables, string dmpFilePath, string logPath, out string log)
        {
            string tableStr = string.Join(",", tables);
            string userId = $"{User}/{Pwd}@{Host}:{Port}";
            string args = $"USERID={userId} FILE=\"{dmpFilePath}\" LOG=\"{logPath}\" TABLES={tableStr} ";
            string exe = IsLinux() ? "dexp" : "dexp.exe";
            return RunCommand(exe, args, out log);
        }
        #endregion

        #region 导入 dimp
        /// <summary>
        /// 全库导入
        /// </summary>
        public bool ImportFullDb(string dmpFilePath, string logPath, bool ignoreExist = true, out string log)
        {
            string userId = $"{User}/{Pwd}@{Host}:{Port}";
            StringBuilder argSb = new StringBuilder();
            argSb.Append($"USERID={userId} ");
            argSb.Append($"FILE=\"{dmpFilePath}\" ");
            argSb.Append($"LOG=\"{logPath}\" ");
            argSb.Append("FULL=Y ");
            argSb.Append("TAVBLE_EXISTS_ACTION=REPLACE ");
            if (ignoreExist) argSb.Append("IGNORE=Y ");

            string exe = IsLinux() ? "dimp" : "dimp.exe";
            return RunCommand(exe, argSb.ToString(), out log);
        }

        /// <summary>
        /// 导入指定用户,支持schema映射(原用户→新用户)
        /// </summary>
        public bool ImportRemapSchema(string sourceOwner, string targetOwner, string dmpFilePath, string logPath, out string log)
        {
            string userId = $"{User}/{Pwd}@{Host}:{Port}";
            string args = $"USERID={userId} FILE=\"{dmpFilePath}\" LOG=\"{logPath}\" REMAP_SCHEMA={sourceOwner}:{targetOwner} IGNORE=Y";
            string exe = IsLinux() ? "dimp" : "dimp.exe";
            return RunCommand(exe, args, out log);
        }
        #endregion

        /// <summary>判断系统是否Linux</summary>
        private bool IsLinux()
        {
            return Environment.OSVersion.Platform == PlatformID.Unix ||
                   Environment.OSVersion.Platform == PlatformID.MacOSX;
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        var dmTool = new DmExpImpHelper
        {
            DmBinPath = @"D:\dmdbms\bin",
            Host = "127.0.0.1",
            Port = 5236,
            User = "",
            Pwd = ""
        };

        // 1. 全库导出
        string dmpFile = @"D:\backup\dm_full.dmp";
        string logFile = @"D:\backup\export.log";
        bool expResult = dmTool.ExportFullDb(dmpFile, logFile, true, out string expLog);
        Console.WriteLine("导出日志:\r\n" + expLog);
        if (expResult)
            Console.WriteLine("导出成功!");
        else
            Console.WriteLine("导出失败!");

        // 2. 导入全库
        string impLog = @"D:\backup\import.log";
        bool impResult = dmTool.ImportFullDb(dmpFile, impLog, true, out string impOutLog);
        Console.WriteLine("导入日志:\r\n" + impOutLog);
    }
}

更多推荐