tubaba 发表于 2013-12-1 10:54:43

在局域网中提供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[回车换行]错误代码[回车换行]错误描述"

tubaba 发表于 2013-12-1 10:59:33

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
请用以上代码测试

zhongzijie 发表于 2013-12-1 12:58:25

下载保存,以备不时之需。

pk196371 发表于 2013-12-1 13:03:43

很不错、赞一个、

lpxx 发表于 2013-12-1 18:10:51

感谢分享。学习一下。

joyran 发表于 2013-12-1 19:57:29

学习了....

huangwei 发表于 2013-12-1 20:55:26

谢谢分享,楼主辛苦了

asionwu 发表于 2013-12-1 20:56:20

好像不错,支持一下

ak47gglllk 发表于 2013-12-2 10:03:58

非常不错的东西,感谢感谢,学习一下

weeks1 发表于 2013-12-2 16:21:19

。支持一下。

lisbonbar 发表于 2013-12-2 18:34:10

留位以备不时之需

netsmu 发表于 2013-12-3 08:17:46

已下载,挺好的东西,感谢作者提供源码。

雨林GG 发表于 2013-12-3 14:11:22

LZ好人啊! 向你学习~!

喀喇喀喇 发表于 2016-2-7 11:45:11

确实很不错,学习了

zghwelcome 发表于 2016-3-1 16:07:39

值得学习,收藏了
页: [1] 2
查看完整版本: 在局域网中提供Access文件访问服务