mysql - 尝试调用 ShellExecute 来运行 Mysql 和 sql 脚本

标签 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 '

filename.sql 已被精简为“创建数据库名称”。

命令窗口会短暂打开并滚动一些消息 - 速度太快而无法阅读。 如果我打开命令窗口并输入相同的程序和命令行,它就可以工作。 失败时我看不到错误消息。

我在 Windows 7 桌面上本地运行。 我尝试将输出定向到日志文件,但我什至没有批量获取该文件。当交互成功时,我确实会收到日志。我已经尝试了所有我能想到的调整。

任何有关如何进行的想法将不胜感激。

最佳答案

您自己说过,在命令提示符下可以使用完全相同的命令。不同之处在于命令解释器 cmd.exe 的存在。它的作用是创建一个管道,将输入文件传送到 MySQL 进程中。

您对这个问题有两个明显的解决方案:

  1. 使用CreateProcess启动进程并自行设置管道。这是一个有点低级的内容,涉及相当多的 Win32 样板文件。如果您需要的话,它确实使阻塞直到进程完成变得更简单。
  2. 获取ShellExecute来调用cmd.exe并要求cmd.exe运行MySQL并整理管道。

选项 2 更简单。它看起来像这样:

ShellExecute(
    0, 
    nil, 
    'cmd.exe', 
    '/c mysql --user=root --password=password < C:/directory/filename.sql',
    nil,
    SW_SHOW
);

/c 切换到 cmd.exe 告诉执行命令然后终止 - 这正是您想要的。

如果您需要阻止进程直到 MySQL 进程完成,那么您可以切换到 ShellExecuteEx。这将返回一个您可以等待的进程句柄。同样,操作起来有点困难,但可能仍然比 CreateProcess 更容易,因为这会迫使您管理管道。

关于mysql - 尝试调用 ShellExecute 来运行 Mysql 和 sql 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15031225/

相关文章:

mysql - SQL 每小时数据

mysql - 每 5 次插入更改一些值(MySQL 存储过程)

c# - 如何使用 Interop 正确地将 Delphi 记录传递到 C# 结构?

delphi - 如何在 RichEdit 中将单行加粗?

winapi - 从非交互式服务 (win32/.net/powershell) 启动 UAC 提升进程

c++ - 使用动态长度初始化 wchar_t

mysql - SQL 在表中划分子查询

c# - 从 2 个表中获取行

delphi - 中断 HTTP GET 操作

delphi - 使用shellexecute时 "printto"的参数是什么?