Pat*_*ney 2 mysql delphi shellexecute
我一直在尝试在 Delphi 应用程序中使用 ShellExecute 打开 Mysql 并运行脚本。
ShellExecute(Handle, 'open', PWideChar(InpCommandProgram.text),
PWideChar(commandline), nil, SW_SHOWNORMAL);
InpCommandProgram.text = 'MYSQL'
commandline = '--user=root --password=password < C:/directory/filename.sql '
Run Code Online (Sandbox Code Playgroud)
filename.sql 已被精简为“创建数据库名称”。
命令窗口会短暂打开并滚动一些消息 - 速度太快而无法阅读。如果我打开命令窗口并输入相同的程序和命令行,它就可以工作。失败时我看不到错误消息。
我在 Windows 7 桌面上本地运行。我尝试将输出定向到日志文件,但我什至没有批量获取该文件。当交互成功时,我确实会收到日志。我已经尝试了所有我能想到的调整。
任何有关如何进行的想法将不胜感激。
当您说完全相同的命令在命令提示符下运行时,您自己也说过了。不同之处在于命令解释器的存在cmd.exe。它的作用是创建一个管道,将输入文件传输到 MySQL 进程中。
对于这个问题,你有两个明显的解决方案:
\n\nCreateProcess启动进程并自行设置管道。这是一个有点低级的内容,涉及相当多的 Win32 样板文件。如果您需要这样做,它确实使阻塞直到进程完成变得更简单。ShellExecute调用cmd.exe并要求cmd.exe运行 MySQL 并整理管道。选项 2 更简单。它看起来像这样:
\n\nShellExecute(\n 0, \n nil, \n 'cmd.exe', \n '/c mysql --user=root --password=password < C:/directory/filename.sql',\n nil,\n SW_SHOW\n);\nRun Code Online (Sandbox Code Playgroud)\n\n开关/c告诉cmd.exe执行命令,然后终止 \xe2\x80\x93 这正是你想要的。
如果您需要阻止进程直到 MySQL 进程完成,那么您可以切换到ShellExecuteEx. 这将返回一个您可以等待的进程句柄。同样,操作起来有点困难,但可能仍然比这更容易,CreateProcess因为这迫使您管理管道。