找回密码
 加入
搜索
查看: 3243|回复: 16

请教 关于ACCESS数据库操作问题

[复制链接]
发表于 2009-10-14 20:42:33 | 显示全部楼层 |阅读模式
本帖最后由 nmgwddj 于 2009-10-16 00:39 编辑

我们这边安装的收费软件是长春同联计费系统

如果有60个机器就要60个卡 每次上机的时候都要拿卡去刷卡器刷一下。(会员自己拿着卡上机)很麻烦。于是我就做了一个免刷卡的工具 具体是这样的。
用户上机的时候回出现此对话框

于是我做了个工具  是这样的

一个机器对应一个按钮 按钮的命令是这样写的
WinWait("用户上机")
WinActivate("用户上机")
Send("@0078571023")
Send("{enter}")


这样的话 也可以用。但是如果编辑成EXE文件的话 去给别的网吧使用 就还得去改源码里的卡号,每个网吧的卡号是不一样的。 (我是做网吧维护的 不是想做坏事 呵呵!)

有一天我看见一个巨巨猫论坛一个人写的刷卡工具 好像是用VB写的。在一个文本文档里 把网吧所有的卡号全部刷到文档里 程序是时时监控“用户上机”这个窗口的。每当出现这个窗口 他就读取文档里边的卡号 自动刷卡。而且不重复。如果把所有卡号都刷满后 其中@0078571023 这个卡号下机了 它自动判断文档里的卡号是否被使用 再新上机器的时候 就用@0078571023这个卡号上机。不重复。

我想问下他是怎么做到的。是否需要读取数据库??下边是数据库文件 请高手帮忙看下!




下面是一个曾经写过的代码 我还是看不明白什么意思。特别是这个 “False Then”命令

#NoTrayIcon
#Region ;**** 参数创建于 AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=ico.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_Comment=同联助手 V1.0 Build 08022101
#AutoIt3Wrapper_Res_Description=同联助手 V1.0 Build 08022101
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=Code By Binsys QQ:123077083 http://www.binsys.cn
#AutoIt3Wrapper_Au3Check_Stop_OnWarning=y
#AutoIt3Wrapper_Run_Tidy=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Constants.au3>
#include <String.au3>
#include <GUIConstantsEx.au3>


Opt("TrayOnEventMode", 1)
Opt("GUIOnEventMode", 1)
Opt("TrayMenuMode", 1)
$Start = TrayCreateItem("开始")
TrayItemSetOnEvent(-1, "StartEvent")
$Pause = TrayCreateItem("暂停")
TrayItemSetOnEvent(-1, "PauseEvent")
;$Set = TrayCreateItem("注册")
;TrayItemSetOnEvent(-1, "SetEvent")
$About = TrayCreateItem("关于")
TrayItemSetOnEvent(-1, "AboutEvent")
$Exit = TrayCreateItem("退出")
TrayItemSetOnEvent(-1, "ExitEvent")


Dim $Runing
Dim $file = "tlhlperconfig.ini"
Dim $TongLianPath
Dim $CardListCount
Dim $CardID[1]
Dim $AutoStart = "1"
Dim $Verison = "同联助手 V1.0 Build 08022101"

RegKey()
If Init() = False Then
       
        MsgBox(0, "错误-" & $Verison, "初始化错误,请检查配置文件tlhlperconfig.ini的正确性!!!")
        Exit
Else
        If $AutoStart = "1" Then
                TraySetState()
                TrayItemSetState($Start, $TRAY_DISABLE)
                TrayItemSetState($Pause, $TRAY_ENABLE)
                $Runing = True
        Else
                TraySetState()
                TrayItemSetState($Start, $TRAY_ENABLE)
                TrayItemSetState($Pause, $TRAY_DISABLE)
                $Runing = False
        EndIf
EndIf
While 1
        Main()
WEnd
Func Init()
        If Not FileExists($file) Then
                $file = @ScriptDir & "\tlhlperconfig.ini"
                If Not FileExists($file) Then
                        $file = @WorkingDir & "\tlhlperconfig.ini"
                EndIf
                If Not FileExists($file) Then
                        Return False
                EndIf
        Else
                $TongLianPath = IniRead(@ScriptDir & "\" & "tlhlperconfig.ini", "Setting", "TongLianPath", "0")
                If $TongLianPath = "" Then
                        Return False
                EndIf
                $AutoStart = IniRead(@ScriptDir & "\" & "tlhlperconfig.ini", "Setting", "AutoStart", "0")
                If $AutoStart = "" Then
                        Return False
                EndIf
                $CardListFilePath = IniRead(@ScriptDir & "\" & "tlhlperconfig.ini", "Setting", "CardListFilePath", "0")
                If $CardListFilePath = "" Then
                        Return False
                EndIf
                $CardListCount = IniRead(@ScriptDir & "\" & "tlhlperconfig.ini", "Setting", "CardListCount", "0")
                If $CardListCount = "" Then
                        Return False
                Else
                        $CardListCount = Number($CardListCount)
                EndIf
                If Not FileExists(@ScriptDir & "\" & $CardListFilePath) Then
                        Return False
                Else
                        $CardListFile = FileOpen($CardListFilePath, 0)

                        ; Check if file opened for reading OK
                        If $CardListFile = -1 Then
                                Return False
                        EndIf

                        ReDim $CardID[$CardListCount]

                        Dim $i = 0

                        For $i = 0 To $CardListCount - 1
                                $CardID[$i] = FileReadLine($CardListFile)
                                If @error = -1 Then ExitLoop
                        Next


                        FileClose($CardListFile)
                EndIf
                Return True
        EndIf

EndFunc   ;==>Init
Func Main()
        If $Runing = False Then Return
        WinWait("用户上机", "")
        If $Runing = False Then Return
        WinActive("用户上机", "")
        If $Runing = False Then Return
        If ControlGetText("用户上机", "", "TEdit5") = "" Then
                $FreeCardID = GetFreeCardID()
                ;Send($FreeCardID)
                ;ControlFocus("用户上机", "", "TEdit5")
                ControlSend("用户上机", "", "TEdit5", $FreeCardID)
                Send("{Enter down}")
                Send("{Enter up}")
                Sleep(20)
                Send("{Enter down}")
                Send("{Enter up}")
                ;$ok = InputBox("输入","请输入上机金额:","","")
                ControlFocus("用户上机", "", "TEdit6")
                ;Sleep(1000)
                ;Send("1")
                ;ControlFocus("用户上机", "", "TMaskEdit2")
                ;Send("1")
                ;ControlFocus("用户上机", "", "TEdit6")
                ;ControlClick("用户上机", "上机", "TBitBtn2")
        EndIf
EndFunc   ;==>Main
Func GetFreeCardID()
        $MDB = $TongLianPath & "\data\data.mdb"
        $Conn = ObjCreate("ADODB.Connection")
        $Conn.Open("Driver={Microsoft Access Driver (*.mdb)};Password=áíùaidf/emfid#dfDS~;Dbq=" & $MDB)

        $RS_PCStatus = ObjCreate("ADODB.Recordset")
        $RS_PCStatus.Open("Select * FROM PCStatus where PCStatus = 1", $Conn, 1, 3)

        $TempCardID = $CardID[Random(0, $CardListCount - 1, 1)]
        $GetFreeCardID = False
       
        While ($GetFreeCardID = False)
                $TempCardID = $CardID[Random(0, $CardListCount - 1, 1)]
                $Flag = False
                While (Not $RS_PCStatus.eof And Not $RS_PCStatus.bof)
                        If $RS_PCStatus.Fields(14).value = $TempCardID Then $Flag = True
                        $RS_PCStatus.movenext
                WEnd
                If $Flag = False Then $GetFreeCardID = True
        WEnd
        $RS_PCStatus.close
        $Conn.close
        Return $TempCardID
EndFunc   ;==>GetFreeCardID
Func StartEvent()
        TrayItemSetState($Start, $TRAY_DISABLE)
        TrayItemSetState($Pause, $TRAY_ENABLE)
        $Runing = True
EndFunc   ;==>StartEvent
Func PauseEvent()
        TrayItemSetState($Pause, $TRAY_DISABLE)
        TrayItemSetState($Start, $TRAY_ENABLE)
        $Runing = False
       
EndFunc   ;==>PauseEvent
Func SetEvent()
        RegKey()
EndFunc   ;==>SetEvent
Func AboutEvent()
        MsgBox(64, "关于", $Verison & @CRLF & @CRLF & @CRLF & "Code By Binsys QQ:123077083" & @CRLF & @CRLF & @CRLF & "www.binsys.cn")
EndFunc   ;==>AboutEvent
Func ExitEvent()
        Exit
EndFunc   ;==>ExitEvent
Dim $Edit2
Dim $Edit1

Func RegKey()

        ;GUICtrlSetData($Edit1, _GetMAC(@IPAddress1) & "/" & _StringEncrypt(1, _GetMAC(@IPAddress1), _GetMAC(@IPAddress1), "2"))
        If (_GetMAC(@IPAddress1) <> "00E37C271D7B") Then
                MsgBox(64, "!同联助手 V1.0 Build 08022101-错误", "此拷贝为 天博星网吧专用!!!需要请联系 123077083")
                ;E()
                Exit
        Else

        EndIf

EndFunc   ;==>RegKey

Func Button1Click()
        If (verifykey(GUICtrlRead($Edit2)) = True) Then
                MsgBox(64, "ok", "regok")
        Else
                MsgBox(64, "ok", "rego err")
        EndIf
EndFunc   ;==>Button1Click
Func Button2Click()
        GUISetState(@SW_HIDE)
EndFunc   ;==>Button2Click
Func Edit1Change()

EndFunc   ;==>Edit1Change
Func Edit2Change()

EndFunc   ;==>Edit2Change
Func Form1Close()

EndFunc   ;==>Form1Close
Func Form1Maximize()

EndFunc   ;==>Form1Maximize
Func Form1Minimize()

EndFunc   ;==>Form1Minimize
Func Form1Restore()

EndFunc   ;==>Form1Restore

Func verifykey($key)
        $keys = StringLeft($key, 12)
        $crypt = StringTrimLeft($key, 12)
        $plain = _StringEncrypt(0, $crypt, _GetMAC(@IPAddress1), "2")
        If $plain <> "" Then
                Return True
               
        Else
                Return False
        EndIf
       

EndFunc   ;==>verifykey




Func _GetMAC($sIP)

        Local $MAC, $MACSize
        Local $i, $s, $r, $iIP

        $MAC = DllStructCreate("byte[6]")
        $MACSize = DllStructCreate("int")
        DllStructSetData($MACSize, 1, 6)
        $r = DllCall("Ws2_32.dll", "int", "inet_addr", "str", $sIP)
        $iIP = $r[0]
        $r = DllCall("iphlpapi.dll", "int", "SendARP", "int", $iIP, "int", 0, "ptr", DllStructGetPtr($MAC), "ptr", DllStructGetPtr($MACSize))
        $s = ""
        For $i = 0 To 5
                ;If $i Then $s = $s & ":"
                $s = $s & Hex(DllStructGetData($MAC, 1, $i + 1), 2)
        Next
        Return $s
EndFunc   ;==>_GetMAC

Func E()

EndFunc   ;==>E

本帖子中包含更多资源

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

×
 楼主| 发表于 2009-10-14 20:54:23 | 显示全部楼层
我是一点思路也没有 谁有个思路也行 告诉下怎么做 我去自己看帮助文档找我自己想要的。
发表于 2009-10-14 21:36:42 | 显示全部楼层
首先你确定需要操作的数据库是ACCESS的?很少见收费系统数据库是ACCESS。
如果是ACCESS数据库,建议你下载ACCESS.UDF。如需汉化版请等待Sxd修正完。
我的思路:建立一个和图一一样的窗口,然后调用INI配置文件读取相应的用户参数。
发表于 2009-10-14 21:36:52 | 显示全部楼层
首先你确定需要操作的数据库是ACCESS的?很少见收费系统数据库是ACCESS。
如果是ACCESS数据库,建议你下载ACCESS.UDF。如需汉化版请等待Sxd修正完。
我的思路:建立一个和图一一样的窗口,然后调用INI配置文件读取相应的用户参数。
发表于 2009-10-14 21:46:51 | 显示全部楼层
囧 我等你的完整例子
发表于 2009-10-14 22:04:12 | 显示全部楼层
囧~~~还需要什么例子哦,后面的都是自定义的。。。
发表于 2009-10-14 22:14:13 | 显示全部楼层
不是你要做个完整的一个么
发表于 2009-10-14 22:24:37 | 显示全部楼层
只能说,一个UDF不能满足所有操作需要,很多时候需要按需修改。
虽然我很想将例子做完整点,但就算做出来了,也不一定满足所有人的需要,最重要还是靠理解其中的意思,编译自己所需要的内容。
发表于 2009-10-14 22:31:44 | 显示全部楼层
本帖最后由 wxb2422 于 2009-10-14 23:08 编辑

 
;判断卡号是否上机
$datename="Data.mdb"
$datepass="áíùaidf/emfid#dfDS~"
$Strn="0078571023"
$addfld = ObjCreate("ADODB.Connection")
$RS = ObjCreate("ADODB.Recordset")
$addfld.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & $datename & ";Jet Oledb:Database Password=" & $datepass)
$RS.ActiveConnection = $addfld
$dqml="select * from PCStatus where UserCardNO= '"&$Strn&"'"  
$RS.Open ( $dqml)
if $rs.eof and $rs.bof then 
        MsgBox(64,"","此卡号未使用,可以开机")
Else
    MsgBox(16,"卡号:"& $Strn, $RS.Fields (13).value&"已在 "&$RS.Fields (1).value&" 号机上使用该卡")
        endif
     $rs.close
     $addfld.Close
exit

;其它的应该就不难了吧
发表于 2009-10-14 23:41:20 | 显示全部楼层
密码倒是很牛:áíùaidf/emfid#dfDS~
发表于 2009-10-15 10:06:22 | 显示全部楼层
那密码,几秒钟就爆出来了
 楼主| 发表于 2009-10-16 00:32:12 | 显示全部楼层
非常感谢2楼和9楼的朋友 非常非常感谢。我自己慢慢研究如何调用INI吧。再说一次 谢谢

1楼我添加了一个人写的代码 很希望您们能帮忙解释一下 我看的实在很头痛。帮助文档已经快被我搜索烂了。!
发表于 2009-10-16 00:37:01 | 显示全部楼层
非常感谢2楼和9楼的朋友 非常非常感谢。我自己慢慢研究如何调用INI吧。再说一次 谢谢

1楼我添加了一个人写的代码 很希望您们能帮忙解释一下 我看的实在很头痛。帮助文档已经快被我搜索烂了。!
nmgwddj 发表于 2009-10-16 00:32

搜烂了再来论坛下一个。
 楼主| 发表于 2009-10-16 01:10:54 | 显示全部楼层
呵呵 楼上的朋友搞笑 就听你的。再下一个
发表于 2009-12-15 16:12:24 | 显示全部楼层
呵呵,好像代码没有全部放完一样。不过收藏了。空了还是研究一下。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-10-2 06:36 , Processed in 0.110191 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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