通过vb的shell方法,调用外部命令。如sqlserver的osql实用工具,但是这样的话,osql执行的sql脚本可能需要花费很长的时间,如何才能保证osql执行完所有的sql之后,才继续执行vb的下一步处理呢?
1.声明2个API,用来检测进程是否在运行。
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'************************************************************************
'【名称】:判断进程是否在运行
'【描述】:
'【备注】:
'************************************************************************
Function IsRunning(ByVal ProgramID) As Boolean '传入进程标识ID
Dim hProgram As Long '被检测的程序进程句柄
'READ_CONTROL (0x00020000L) 131072
'SYNCHRONIZE (0x00100000L) 1048576
'WRITE_OWNER (0x00080000L) 524288
hProgram = OpenProcess(131072, False, ProgramID)
If hProgram = 0 Then
IsRunning = False
Else
IsRunning = True
End If
CloseHandle hProgram
End Function
2.调用外部命令之后,不断的轮询该外部命令对应的进程是否已经关闭。
'调用sqlserver的osql工具来执行sql脚本
'输入输出文件路径需要加上引号(sQuote),否则如果路径中有空格,则DOS命令会找不到相应路径
RetVal = Shell("osql -U" & INI_SqlUid & _
" -P" & INI_SqlPwd & _
" -H" & INI_SqlHost & _
" -d" & INI_SqlDb & _
" -i" & sQuote & gInputFile & sQuote, vbNormalFocus)
'当使用DOS管道命令“>>”(内部命令)时,需要按照cmd /C的方式进行调用。
RetVal = Shell("cmd /C osql -U" & INI_SqlUid & _
" -P" & INI_SqlPwd & _
" -H" & INI_SqlHost & _
" -d" & INI_SqlDb & _
" -i" & sQuote & gInputFile & sQuote & _
" >>" & sQuote & gLogFile & sQuote _
, vbNormalFocus)
'检测所调用的外部程序是否运行完毕
While IsRunning(RetVal)
DoEvents
Wend
参考:
1.http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/openprocess.asp
2.http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/process_security_and_access_rights.asp
3.所有 DB-Library 应用程序(如 isql)连接到 SQL Server 2000 后,作为 SQL Server 6.5 级客户端工作。它们不支持 SQL Server 2000 的某些功能。而 osql 实用工具是基于 ODBC 并支持 SQL Server 2000 的全部功能。
4.如果需要调用DOS的内部命令,需要使用下面的方法:
Shell "Command.com /C copy c:\autoexec.bat d:\aaa.bat"
/C string Carries out the command specified by string, and then stops.
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=3488666
[2005-11-11 11:57:53.0] 在VB中以“同步”的方式调用DOS命令
[2005-11-11 12:06:07.0] 在VB中以“同步”的方式调用DOS命令
[2005-11-09 09:53:07.0] 常用命令
[2005-11-10 22:26:57.0] DOS命令
[2005-11-05 19:11:48.0] 命令 ping