找回密码
 加入
搜索
查看: 9931|回复: 19

[原创] 在局域网中提供Access文件访问服务

 火.. [复制链接]
发表于 2013-12-1 10:54:43 | 显示全部楼层 |阅读模式
本帖最后由 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[回车换行]错误代码[回车换行]错误描述"

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 2金钱 +70 收起 理由
lpxx + 50 很棒的见解
绿色风 + 20 好,不错

查看全部评分

 楼主| 发表于 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[0])
                Case 'backup';下载文件
                        If IsArray($aRes) Then
                                DirCreate(@WorkingDir & "\DBback")
                                Local $savefile = FileOpenDialog('指定文件存放位置', @WorkingDir & "\DBback", "所有支持的文件 (*.mdb)", 1 + 2 + 8, $aRes[1], $hGUI)
                                If Not @error Then
                                        Local $rFile = FileOpen($savefile, 2 + 8 + 16)
                                        _TCPRecvFile($rFile, $aRes[0])
                                        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[0] == 'error'
                                TCPShutdown()
                                MsgBox(0, '发生错误', $aRes[1], '', $hGUI)
                                Return SetError(3, 0, False)
                        Case $aRes[0] == 'query'
                                TCPShutdown()
                                Return SetError(0, 0, $aRes[1])
                        Case $aRes[0] == 'update'
                                TCPShutdown()
                                Return SetError(0, 0, $aRes[1])
                        Case $aRes[0] == 'backup'
                                Local $get = StringSplit($aRes[1], '|', 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[2], $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[0]
                Case 'query'
                        If $Res[1] == 'error' Then
                                $Return[0] = 'error'
                                $Return[1] = '不能正确显示结果,无可用分隔符,请联系作者' & @CRLF & @CRLF & $Res[2]
                        Else
                                $tempArray = _StringToArray2D($Res[2], $Res[1])
                                If @error Then Return SetError(3, 0, False)
                                $Return[0] = 'query'
                                $Return[1] = $tempArray
                        EndIf
                Case 'update'
                        $Return[0] = 'update'
                        $Return[1] = $Res[2]
                Case 'error'
                        $Return[0] = 'error'
                        $Return[1] = $Res[2]
                Case 'backup'
                        $Return[0] = 'backup'
                        $Return[1] = $Res[1] & '|' & $Res[2]
                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[1]][$temp[2]]
        $k = 3
        For $i = 0 To $temp[1] - 1
                For $j = 0 To $temp[2] - 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
请用以上代码测试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1贡献 +5 收起 理由
绿色风 + 5 不错,好

查看全部评分

发表于 2013-12-1 12:58:25 | 显示全部楼层
下载保存,以备不时之需。
发表于 2013-12-1 13:03:43 | 显示全部楼层
很不错、赞一个、
发表于 2013-12-1 18:10:51 | 显示全部楼层
感谢分享。学习一下。
发表于 2013-12-1 19:57:29 | 显示全部楼层
学习了....
发表于 2013-12-1 20:55:26 | 显示全部楼层
谢谢分享,楼主辛苦了
发表于 2013-12-1 20:56:20 | 显示全部楼层
好像不错,支持一下
发表于 2013-12-2 10:03:58 | 显示全部楼层
非常不错的东西,感谢感谢,学习一下
发表于 2013-12-2 16:21:19 | 显示全部楼层
。支持一下。
发表于 2013-12-2 18:34:10 | 显示全部楼层
留位以备不时之需
发表于 2013-12-3 08:17:46 | 显示全部楼层
已下载,挺好的东西,感谢作者提供源码。
发表于 2013-12-3 14:11:22 | 显示全部楼层
LZ好人啊! 向你学习~!
发表于 2016-2-7 11:45:11 | 显示全部楼层
确实很不错,学习了
发表于 2016-3-1 16:07:39 | 显示全部楼层
值得学习,收藏了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-26 23:24 , Processed in 0.091646 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表