这里有一个解决方案 - 使用执行进程。
它适用于所有安装变体的
MS SQL
(带有100-170)。
function ExecuteProcess(const FileName, Params: string;
Folder: string; WaitUntilTerminated, WaitUntilIdle, RunMinimized: Boolean;
var ErrorCode: Integer): Boolean;
var
cmdLine: string;
WorkingDirP: PChar;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
Result := true;
cmdLine := '"' + FileName + '" ' + Params;
if Folder = '' then
Folder := ExcludeTrailingPathDelimiter(ExtractFilePath(FileName));
ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
StartupInfo.cb := SizeOf(StartupInfo);
if RunMinimized then
begin
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_SHOWMINIMIZED;
end;
if Folder <> '' then
WorkingDirP := PChar(Folder)
else
WorkingDirP := nil;
if not CreateProcess(nil, PChar(cmdLine), nil, nil, false, 0, nil,
WorkingDirP, StartupInfo, ProcessInfo) then
begin
Result := false;
ErrorCode := GetLastError;
exit;
end;
with ProcessInfo do
begin
CloseHandle(hThread);
if WaitUntilIdle then
WaitForInputIdle(hProcess, INFINITE);
if WaitUntilTerminated then
repeat
Application.ProcessMessages;
until MsgWaitForMultipleObjects(1, hProcess, false, INFINITE, QS_ALLINPUT)
<> WAIT_OBJECT_0 + 1;
CloseHandle(hProcess);
end;
end;
procedure TestForsqlCmd();
var
errCode: Integer;
success: Boolean;
begin
success := ExecuteProcess('sqlcmd.exe', '-?', '', true, true, true, errCode);
if not success then
begin
s := 'The application ''sqlcmd.exe'' wasn''t found!' + sLineBreak +
'The MS SQLEXPRESS utility is missing.' + sLineBreak +
'Press EXIT when ready.';
MessageDlg(s, TMsgDlgType.mtError, [mbOk], 0);
exit;
end;
end;
sqlcmd.exe -?
,如果它能够正常工作,那么SQLCMD就已经存在了。如果不能正常工作,它会告诉你一些类似于“文件未找到”或“命令无效”的信息... - marc_s