Private Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Long hStdInput As Long hStdOutput As Long hStdError As Long End Type Private Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessID As Long dwThreadID As Long End Type Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _ hHandle As Long, ByVal dwMilliseconds As Long) As Long Private Declare Function CreateProcessA Lib "kernel32" (ByVal _ lpApplicationName As String, ByVal lpCommandLine As String, ByVal _ lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _ ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _ ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As String, _ lpStartupInfo As STARTUPINFO, lpProcessInformation As _ PROCESS_INFORMATION) As Long Private Declare Function CloseHandle Lib "kernel32" _ (ByVal hObject As Long) As Long Private Declare Function GetExitCodeProcess Lib "kernel32" _ (ByVal hProcess As Long, lpExitCode As Long) As Long Private Const NORMAL_PRIORITY_CLASS = &H20& Private Const INFINITE = -1& Public Function ExecCmd(cmdline$) Dim proc As PROCESS_INFORMATION Dim start As STARTUPINFO ' Initialize the STARTUPINFO structure: start.cb = Len(start) ' Start the shelled application: ret& = CreateProcessA(vbNullString, cmdline$, 0&, 0&, 1&, _ NORMAL_PRIORITY_CLASS, 0&, vbNullString, start, proc) ' Wait for the shelled application to finish: ret& = WaitForSingleObject(proc.hProcess, INFINITE) Call GetExitCodeProcess(proc.hProcess, ret&) Call CloseHandle(proc.hThread) Call CloseHandle(proc.hProcess) ExecCmd = ret& End Function Sub Form_Click()
End SubPrivate Sub testCreateProcess_Click() Dim retval As Long retval = ExecCmd("dtsrun /S 远程SQL的IP地址 /U 用户 /P 密码 /N 数据库名 /M") ' MsgBox "Process Finished, Exit Code " & retval MsgBox retval If retval = 1 Then MsgBox "网络不通,请检查是否已经连上互联网" If retval = 0 Then MsgBox "成功" Else MsgBox "失败" End If End Sub
错了,上面/N后是要执行的DTS名称,不是数据库名.
远程数据传送方法的讨论 之前做的一些系统中都涉及将本地数据上传到远程数据库服务器,或者将远程数据库服务器的数据下载的本地,都不知道用那种方式实现更方便,更安全 一种是用这样的方式实现 在远程服务器写一个ASP文件接收数据如: <% If Request.ServerVariables("REQUEST_METHOD")="POST" Then ON ERROR RESUME NEXT Dim AttendArray Dim ResStr Set xmldom=Server.CreateObject("Microsoft.XMLDOM") Set Obj=Server.CreateObject("SAS.SHIFT") xmldom.load(Request) Set Rs=Server.CreateObject("ADODB.Recordset") Rs.Open xmldom AttendArray=Rs.GetRows If IsArray(AttendArray) Then ResStr=Obj.AddAttendRecord(AttendArray) End If If Err.number =0 Then Response.Write "OK" Set xmlResult=Server.CreateObject("Microsoft.XMLDOM") xmlResult.save(Response) Set xmlResult=Nothing Else Response.Write "NO" Set xmlResult=Server.CreateObject("Microsoft.XMLDOM") xmlResult.save(Response) Set xmlResult=Nothing End If End If %> 客户端这样写的 Dim Url As String Url = "http://"; & ServerName & "/shift/AddAttendRecord.asp"
Dim Conn As ADODB.Connection Dim rs As ADODB.Recordset Dim Strm As ADODB.Stream Dim XMLHttp As XMLHTTPRequest Dim ObjSas As InstantPassCls.clsSAS Dim AttendArray As Variant Dim i As Integer Set rs = New ADODB.Recordset Set ObjSas = New InstantPassCls.clsSAS AttendArray = ObjSas.GetUploadRecord
If IsArray(AttendArray) Then
With rs.Fields .Append "StaffNo", adBSTR .Append "Time", adBSTR .Append "AttendType", adBSTR End With rs.Open With rs For i = 0 To UBound(AttendArray, 2) .AddNew .Fields("StaffNO") = AttendArray(0, i) .Fields("Time") = AttendArray(1, i) .Fields("AttendType") = AttendArray(2, i) .Update Next i End With
Set Strm = New ADODB.Stream rs.Save Strm, adPersistXML Set XMLHttp = New XMLHTTPRequest XMLHttp.Open "POST", Url, False XMLHttp.send Strm.ReadText
If Err.Number = 0 Then UPloadData = XMLHttp.responseText Sleep (10000) 'If Left(UPloadData, 2) = "NO" Then If InStr(1, UPloadData, "NO") > 0 Then UPloadData = LoadResString(5038) WriteLog 4, "Upload data failed" End If 'If Left(UPloadData, 2) = "OK" Then If InStr(1, UPloadData, "OK") > 0 Then ObjSas.MarkRecord WriteLog 4, "Upload data success" UPloadData = LoadResString(5037) End If Else UPloadData = LoadResString(5036) WriteLog 4, "Upload data failed" End If
Else UPloadData = LoadResString(5035) End If
Set ObjSas = Nothing Set rs = Nothing
用RDS直接传送recordset 我的服务器上先设置好了,供大家测试下面的代码,10天后可能会取消这个服务。 如以后想测试,可到我的论坛中提出。 http://office.9zp.com引用 Microsoft Remote Data Services x.x Library 引用 ADODim DF As Object Dim strServer As String Dim strConnect As String Dim strSQL As String Dim objADORs As Recordset Dim ds As New DataSpace strServer = "http://9zp.com"; strConnect = "Data Source=hzn;" strSQL = "Select * from parts" Set DF = ds.CreateObject("RDSServer.DataFactory", strServer) Set objADORs = DF.Query(strConnect, strSQL) MsgBox objADORs.Fields(0) objADORs.Fields(0) = "改变这几个字再运一次" DF.SubmitChanges strConnect, objADORs MsgBox objADORs.Fields(0)
ACCESS数据库??????????????//
<?xml-stylesheet type="text/xsl" href="Update.xsl"?>
<page> <update>
<title>WinRar 解压缩工具</title>
<url>wrar32b5sc.exe</url>
<time>2003-7-15</time>
<fileformat>exe</fileformat>
<filesize>952K</filesize>
<note>说明:解压缩的程序</note>
</update>
</page>
例子参考:
http://www.dapha.net/down/list.asp?id=605
filename=...'第1个文件
filepath=...
filever=...
filesize=...
filename=...'第2个文件
filepath=...
filever=...
filesize=...
...
相应你的程序把相应文件名称、路径、版本记录在注册表或另一个本地文本文件中,当你的程序设为自动升级时,每次启动先下载这个文本文件,再在程序中对本地文件(或注册表)记录的版本信息进行对比,如果发现服务器的比较新,则提示升级,否则不升级,升级成功后把新的信息写到注册表中。
我的程序就是这样实现自动升级的,好处是可以对所有文件升级.建议要另写一个升级程序,这样可以对主程序升级.
当用户登录后就访问日志文件.如果发现文件是最新的.就以\\server\fileshare\file的形式将本地文件覆盖呀,懂了吗/ 不懂QQ找我:470829
访问,
判断是否可以更新数据,
通过ASP给客户端数据就OK了
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
hHandle As Long, ByVal dwMilliseconds As Long) As Long Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
lpApplicationName As String, ByVal lpCommandLine As String, ByVal _
lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As String, _
lpStartupInfo As STARTUPINFO, lpProcessInformation As _
PROCESS_INFORMATION) As Long Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long Private Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const INFINITE = -1& Public Function ExecCmd(cmdline$)
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO ' Initialize the STARTUPINFO structure:
start.cb = Len(start) ' Start the shelled application:
ret& = CreateProcessA(vbNullString, cmdline$, 0&, 0&, 1&, _
NORMAL_PRIORITY_CLASS, 0&, vbNullString, start, proc) ' Wait for the shelled application to finish:
ret& = WaitForSingleObject(proc.hProcess, INFINITE)
Call GetExitCodeProcess(proc.hProcess, ret&)
Call CloseHandle(proc.hThread)
Call CloseHandle(proc.hProcess)
ExecCmd = ret&
End Function Sub Form_Click()
End SubPrivate Sub testCreateProcess_Click()
Dim retval As Long
retval = ExecCmd("dtsrun /S 远程SQL的IP地址 /U 用户 /P 密码 /N 数据库名 /M")
' MsgBox "Process Finished, Exit Code " & retval
MsgBox retval
If retval = 1 Then MsgBox "网络不通,请检查是否已经连上互联网"
If retval = 0 Then
MsgBox "成功"
Else
MsgBox "失败"
End If
End Sub
之前做的一些系统中都涉及将本地数据上传到远程数据库服务器,或者将远程数据库服务器的数据下载的本地,都不知道用那种方式实现更方便,更安全
一种是用这样的方式实现
在远程服务器写一个ASP文件接收数据如: <% If Request.ServerVariables("REQUEST_METHOD")="POST" Then
ON ERROR RESUME NEXT
Dim AttendArray
Dim ResStr
Set xmldom=Server.CreateObject("Microsoft.XMLDOM")
Set Obj=Server.CreateObject("SAS.SHIFT")
xmldom.load(Request)
Set Rs=Server.CreateObject("ADODB.Recordset")
Rs.Open xmldom
AttendArray=Rs.GetRows
If IsArray(AttendArray) Then
ResStr=Obj.AddAttendRecord(AttendArray)
End If
If Err.number =0 Then
Response.Write "OK"
Set xmlResult=Server.CreateObject("Microsoft.XMLDOM")
xmlResult.save(Response)
Set xmlResult=Nothing
Else
Response.Write "NO"
Set xmlResult=Server.CreateObject("Microsoft.XMLDOM")
xmlResult.save(Response)
Set xmlResult=Nothing
End If
End If
%>
客户端这样写的 Dim Url As String Url = "http://"; & ServerName & "/shift/AddAttendRecord.asp"
Dim Conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim Strm As ADODB.Stream
Dim XMLHttp As XMLHTTPRequest
Dim ObjSas As InstantPassCls.clsSAS
Dim AttendArray As Variant
Dim i As Integer
Set rs = New ADODB.Recordset
Set ObjSas = New InstantPassCls.clsSAS
AttendArray = ObjSas.GetUploadRecord
If IsArray(AttendArray) Then
With rs.Fields
.Append "StaffNo", adBSTR
.Append "Time", adBSTR
.Append "AttendType", adBSTR
End With
rs.Open
With rs
For i = 0 To UBound(AttendArray, 2)
.AddNew
.Fields("StaffNO") = AttendArray(0, i)
.Fields("Time") = AttendArray(1, i)
.Fields("AttendType") = AttendArray(2, i)
.Update
Next i
End With
Set Strm = New ADODB.Stream
rs.Save Strm, adPersistXML
Set XMLHttp = New XMLHTTPRequest
XMLHttp.Open "POST", Url, False
XMLHttp.send Strm.ReadText
If Err.Number = 0 Then
UPloadData = XMLHttp.responseText
Sleep (10000)
'If Left(UPloadData, 2) = "NO" Then
If InStr(1, UPloadData, "NO") > 0 Then
UPloadData = LoadResString(5038)
WriteLog 4, "Upload data failed"
End If
'If Left(UPloadData, 2) = "OK" Then
If InStr(1, UPloadData, "OK") > 0 Then
ObjSas.MarkRecord
WriteLog 4, "Upload data success"
UPloadData = LoadResString(5037)
End If
Else
UPloadData = LoadResString(5036)
WriteLog 4, "Upload data failed"
End If
Else
UPloadData = LoadResString(5035)
End If
Set ObjSas = Nothing
Set rs = Nothing
我的服务器上先设置好了,供大家测试下面的代码,10天后可能会取消这个服务。
如以后想测试,可到我的论坛中提出。
http://office.9zp.com引用 Microsoft Remote Data Services x.x Library
引用 ADODim DF As Object
Dim strServer As String
Dim strConnect As String
Dim strSQL As String
Dim objADORs As Recordset
Dim ds As New DataSpace
strServer = "http://9zp.com";
strConnect = "Data Source=hzn;"
strSQL = "Select * from parts"
Set DF = ds.CreateObject("RDSServer.DataFactory", strServer)
Set objADORs = DF.Query(strConnect, strSQL)
MsgBox objADORs.Fields(0)
objADORs.Fields(0) = "改变这几个字再运一次"
DF.SubmitChanges strConnect, objADORs
MsgBox objADORs.Fields(0)