在局域网中提供Access文件访问服务
本帖最后由 tubaba 于 2013-12-1 12:29 编辑在局域网中提供Access文件访问服务
因不想使用sql server数据库,网上也没有access 远程访问的方法.所以做了这么个东西
原理:接收客户端发来的查询,更新等命令查询数据库,并将查询结果返回给客户端
报文接收格式:
===========================
===========================
数据库查询请使用以下格式:
query[回车换行]查询语句
举例:
query
select * from table_name where (条件)
返回值:
"query[回车换行]分隔符[回车换行]查询结果(二维数组转化的以 分隔符 分割的字符串)"
如查询结果不能被分隔成字符串则返回:"query[回车换行]error[回车换行]查询结果(二维数组转化的无分隔符分割的字符串)"
分隔符取"(,^)(,^^)(|)(||)(|||)(^%$*)(*^#)"括号内字符中的一种
如果查询结果包含以上所有分隔符,将不能正确返回
===========================
===========================
数据库更新请使用以下格式:
update[回车换行]查询语句
举例:
update
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
返回值:
"update[回车换行]空格[回车换行]执行结果标志(如成功执行,则标志为0)"
===========================
===========================
数据库文件信息查询请使用以下格式:
backup[回车换行][空格]
举例:
backup
返回值:
"backup[回车换行]数据库文件大小[回车换行]数据库文件名称"
===========================
===========================
下载数据库文件请使用以下格式:
get[回车换行][空格]
返回值:
发送当前连接的数据库文件二进制数据
===========================
===========================
发生错误时,返回:"error[回车换行]错误代码[回车换行]错误描述"
RE: 在局域网中提供Access文件访问服务
本帖最后由 tubaba 于 2013-12-3 08:48 编辑源码在这,不过要花G币哦#include <Array.au3>
Local $ConnectedSocket, $szData
;指定服务端的IP地址
Local $szIPADDRESS = @IPAddress1
;指定服务端的端口
Local $nPORT = 65432
Local $hGUI = GUICreate('')
While 1
$message = "选择要执行的命令:"
$openfile = FileOpenDialog($message, @WorkingDir & "\", "所有支持的文件 (*.txt)", 1, '', $hGUI)
If @error Then
Exit
EndIf
$szData = FileRead($openfile)
Local $Res = StringRegExp($szData, '(?s)(?i)([^\r\n]+)(?:\r?\n)(.+)', 3)
If @error Then
MsgBox(0, '', '读取格式错误', '', $hGUI)
Exit
EndIf
If UBound($Res) <> 2 Then
MsgBox(0, '', '读取格式错误', '', $hGUI)
Exit
EndIf
Local $aRes = _TCPSendData($szData)
Switch StringLower($Res)
Case 'backup';下载文件
If IsArray($aRes) Then
DirCreate(@WorkingDir & "\DBback")
Local $savefile = FileOpenDialog('指定文件存放位置', @WorkingDir & "\DBback", "所有支持的文件 (*.mdb)", 1 + 2 + 8, $aRes, $hGUI)
If Not @error Then
Local $rFile = FileOpen($savefile, 2 + 8 + 16)
_TCPRecvFile($rFile, $aRes)
If Not @error Then MsgBox(0, '', '下载完成')
EndIf
EndIf
Case Else
If IsArray($aRes) Then
_ArrayDisplay($aRes)
Else
MsgBox(0, '执行结果', $aRes, '', $hGUI)
EndIf
EndSwitch
WEnd
Func _TCPSendData($str)
If $str = '' Then Return SetError(1, 0, False)
TCPStartup()
$ConnectedSocket = -1
$ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
If @error Then
MsgBox(0, "", "TCP连接失败,服务端未启用!错误代码: " & @error, '', $hGUI)
Return SetError(2, 0, False)
EndIf
Local $szData = $str
$szData = StringToBinary($szData & Chr(4), 4)
TCPSend($ConnectedSocket, $szData)
Sleep(10)
Local $string
While $string = ''
$string = _TCPRecv()
WEnd
Local $aRes = _DeConversion($string)
If Not @error Then
Select
Case $aRes == 'error'
TCPShutdown()
MsgBox(0, '发生错误', $aRes, '', $hGUI)
Return SetError(3, 0, False)
Case $aRes == 'query'
TCPShutdown()
Return SetError(0, 0, $aRes)
Case $aRes == 'update'
TCPShutdown()
Return SetError(0, 0, $aRes)
Case $aRes == 'backup'
Local $get = StringSplit($aRes, '|', 2)
Return SetError(0, 0, $get)
EndSelect
Else
TCPShutdown()
MsgBox(0, '', '读取数据失败,请重试', '', $hGUI)
Return SetError(4, 0, False)
EndIf
EndFunc ;==>_TCPSendData
Func _DeConversion($str)
Local $Return, $Res, $tempArray
$Res = StringRegExp($str, '(?s)(?i)([^\r?\n]+)(?:\r?\n)([^\r?\n]+)(?:\r?\n)(.+)', 3)
If @error Then Return SetError(1, 0, False)
If UBound($Res) <> 3 Then Return SetError(2, 0, False)
Switch $Res
Case 'query'
If $Res == 'error' Then
$Return = 'error'
$Return = '不能正确显示结果,无可用分隔符,请联系作者' & @CRLF & @CRLF & $Res
Else
$tempArray = _StringToArray2D($Res, $Res)
If @error Then Return SetError(3, 0, False)
$Return = 'query'
$Return = $tempArray
EndIf
Case 'update'
$Return = 'update'
$Return = $Res
Case 'error'
$Return = 'error'
$Return = $Res
Case 'backup'
$Return = 'backup'
$Return = $Res & '|' & $Res
Case Else
Return SetError(4, 0, False)
EndSwitch
Return SetError(0, 0, $Return)
EndFunc ;==>_DeConversion
Func _StringToArray2D($data, $sDelim = "|")
Local $temp, $string, $k
$string = $data
$temp = StringSplit($string, $sDelim, 1)
Local $array2d[$temp][$temp]
$k = 3
For $i = 0 To $temp - 1
For $j = 0 To $temp - 1
If UBound($temp) > $k Then
$array2d[$i][$j] = $temp[$k]
$k += 1
Else
Return SetError(1, 0, 0)
EndIf
Next
Next
Return SetError(0, 0, $array2d)
EndFunc ;==>_StringToArray2D
Func _TCPRecv()
Local $recv, $string = ''
While 1
$recv = TCPRecv($ConnectedSocket, 2048, 1)
If $recv = '' Then ExitLoop
If $recv <> '' Then $string &= BinaryToString($recv, 4)
WEnd
Return $string
EndFunc ;==>_TCPRecv
Func _TCPRecvFile($rFile, $rFileSize)
If $rFile = '' Then Return SetError(1, 0, False)
If $rFileSize <= 0 Then Return SetError(2, 0, False)
TCPStartup()
$ConnectedSocket = -1
$ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
If @error Then
MsgBox(0, "", "TCP连接失败,服务端未启用!错误代码: " & @error, '', $hGUI)
Return SetError(3, 0, False)
EndIf
Local $szData = 'get' & @CRLF & ' '
$szData = StringToBinary($szData & Chr(4), 4)
TCPSend($ConnectedSocket, $szData)
Sleep(10)
Local $rData, $ri = 0;字节计数器归零
While 1
$rData = TCPRecv($ConnectedSocket, 1024 * 1024, 1);开始接收二进制文件数据
If Not @error Then
$ri += BinaryLen($rData);已读取字节计数器
ToolTip('已下载字节:' & $ri)
FileWrite($rFile, $rData);写入文件
Else
Return SetError(1, 0, False)
EndIf
If $ri = $rFileSize Then ExitLoop;计数器与文件实际字节相符退出到主循环
WEnd
FileClose($rFile);关闭文件句柄
Return SetError(0, 0, True)
EndFunc ;==>_TCPRecvFile
请用以上代码测试 下载保存,以备不时之需。 很不错、赞一个、 感谢分享。学习一下。 学习了.... 谢谢分享,楼主辛苦了 好像不错,支持一下 非常不错的东西,感谢感谢,学习一下 。支持一下。 留位以备不时之需 已下载,挺好的东西,感谢作者提供源码。 LZ好人啊! 向你学习~! 确实很不错,学习了 值得学习,收藏了
页:
[1]
2