不是小灵通 发表于 2021-4-2 15:40:29

【含代码】帮忙分析一下为什么exe在其他电脑上不能连接MySQL数据库

本帖最后由 不是小灵通 于 2021-4-5 19:16 编辑

学校机房,做了个小程序,用到MySQL数据库,我开发的电脑上完全能正常运行,但exe拿去学生机,就无法连接MySQL数据库了,需要在学生机里面进行什么设置?
windows32里面也拷贝了libmysql.dll文件(区分X86和X64的两个版本,不同电脑选用其一)

--------------------------------
学生签到程序,和给领导做的查找数据库程序源码都发在了本帖中后续楼层
但查找工具中,目前不知道中文如何传递,无法按姓名和班级等等查询。。。大神有好方法帮忙支招,回头再来慢慢弄

一并向大力协助的朋友们致敬!

不是小灵通 发表于 2021-4-2 15:43:21

本帖最后由 不是小灵通 于 2021-4-2 15:46 编辑

机房电子签到程序
原理很简单:收集本机IP,机器名
学生来时输入学号,然后一并传MySQL去存放,并实时产生一个时间戳。
libmysql.dll是通过FTP服务器自动选择下载到本机的,怕权限不够,手工在本地32文件夹拷贝进去,然而还是不行

Xxkwwz 发表于 2021-4-3 09:27:03

代码不贴出来,全靠猜?:face (9):

不是小灵通 发表于 2021-4-3 18:51:17

Xxkwwz 发表于 2021-4-3 09:27
代码不贴出来,全靠猜?

#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_Icon=C:\Windows\system32\SHELL32.dll
#AutoIt3Wrapper_Outfile=C:\Users\Administrator\Desktop\qiandao3306.exe
#AutoIt3Wrapper_UseUpx=n
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#include <array.au3>
#include "mysql.au3"
;#include <Date.au3>
;#include <Timers.au3>
#include <FTPEx.au3>

;FTP服务器参数
Global $FTP244_IP = "192.168.0.2"
Global $FTP244_Port = 21
Global $FTP244_User = "abc1"
Global $FTP244_PW = "abc1"
Local $FTP244_Open = 0
Local $FTP244_Connect = 0
Global $FTP244_RemoteFile = "\" & @OSArch & "\libmysql.dll";判断本机OS位数,分别定向于X86或X64文件夹
Global $FTP244_LocalFile = "C:\Windows\System32\libmysql.dll"

;管理服务器参数
Global $serverIP = "192.168.0.3"
Global $conname = "2021"
Global $userID = "abc2"
Global $userPD = "abc2"
Global $DBname = "abc2"

Local $Ver = "V0.0.0.0"
Local $pc_ip = ""
Local $pc_name = ""
Local $Input1 = ""
Local $Input2 = ""
Local $login = 0

Global $stu_num = ""
Global $stu_name
Global $stu_college = ""
Global $stu_class = ""
Global $order_code = ""


;================环境检测,核实是否存在必要的libmysql.dll,没有就FTP服务器去下载一个,直至成功==================OK!
If Not FileExists($FTP244_LocalFile) Then
        getdll()
EndIf


#Region ### START Koda GUI section ### Form=d:\au3\教学运行管理系统\签到登陆.kxf
$Form1_1 = GUICreate("计算机实验室签到系统", 610, 238, 192, 124)
$Label1 = GUICtrlCreateLabel("计算机实验室签到系统", 42, 32, 524, 36)
GUICtrlSetFont(-1, 20, 400, 0, "MS Sans Serif")

$Label2 = GUICtrlCreateLabel("请输入学号", 64, 120, 64, 17)
$Input1 = GUICtrlCreateInput("", 144, 118, 121, 21)

;$Label3 = GUICtrlCreateLabel("请输入预约码", 52, 160, 76, 17)
;$Input2 = GUICtrlCreateInput("", 144, 158, 121, 21)

$Button1 = GUICtrlCreateButton("确定", 416, 116, 75, 25)
$Button2 = GUICtrlCreateButton("重置", 416, 156, 75, 25)

$Label4 = GUICtrlCreateLabel($Ver, 496, 208, 102, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        MsgBox(0, "来自服务器消息", "本次签到操作并未被服务器记录!", 6)
                        ;TheEnd()
                        Exit
                Case $Button1
                        GUISetState(@SW_HIDE)
                        ;收集本机信息
                        myPC()
                       
                        ;将学号传去服务器,在stu_info表中校验身份
                        $query = "SELECT * FROM stu_info where stu_num ='" & $stu_num & "'";需要查询的语句;Mysql命令行
                        readdb($query)
                       
                        If $login = 1 Then
                                ;MsgBox(0,"来自服务器消息","欢迎 " & $stu_name & $stu_college & "(" & $stu_num & ")" & "同学,签到成功!机号:"& $pc_name,6)
                               
                                ;================去服务器新【stu_login】表建一条记录,上报:学号,预约码,机器名,机器IP(同时数据库自动记录登录时间)===================OK!
                                $query = "INSERT INTO stu_login(stu_num,pc_name,pc_ip) VALUES('" & $stu_num & "','" & $pc_name & "','" & $pc_ip & "' )"
                                ;MsgBox(0,"待写入MySQL的语句测试",$query)
                                writedb($query)

                                MsgBox(0, "来自服务器消息", "欢迎 " & $stu_name & "(" & $stu_num & ")" & "同学,签到成功!" & @CRLF & @CRLF & "当前机号:" & $pc_name, 6)
                                Exit
                        EndIf
                Case $Button2
                        GUICtrlSetData($Input1, "")
                        GUICtrlSetData($Input2, "")
        EndSwitch
WEnd

Func myPC()
        $stu_num = GUICtrlRead($Input1)
        $order_code = GUICtrlRead($Input2)
        $pc_ip = @IPAddress1;获取本机IP
        $pc_name = @ComputerName;获取本机机器名
EndFunc   ;==>myPC

Func getdll();检验本地system32有无“libmysql.dll”文件,若无,则根据X86或X64,从FTP服务器分别下载相应版本的libmysql.dll文件
        Do
                $FTP244_Open = _FTP_Open("MY_FTP");创建一个FTP会话
                If $FTP244_Open = 0 Then;判断创建会话是否成功
                        MsgBox(0, "错误", "本机创建会话失败!")
                        ContinueLoop
                EndIf;结束判断

                $FTP244_Connect = _FTP_Connect($FTP244_Open, $FTP244_IP, $FTP244_User, $FTP244_PW, $FTP244_Port)
                If $FTP244_Connect = 0 Then;连接失败
                        Beep(80, 100)
                        MsgBox(64, "连接服务器失败", "发生此错误的可能性:" & @CRLF & @CRLF & "    1、服务器IP是否正确?" & @CRLF & "    2、用户名/密码是否不匹配?" & @CRLF & "    3、线路故障?" & @CRLF & @CRLF & "请核对后重试...")
                EndIf;判断结束

                $File244_found = _FTP_FileGet($FTP244_Connect, $FTP244_RemoteFile, $FTP244_LocalFile)
                _FTP_Close($FTP244_Open)
               
                If FileExists($FTP244_LocalFile) Then;检测文件是否已下载成功
                        ;MsgBox(4096, "环境检测", $FTP244_LocalFile &"下载已成功")
                Else
                        If MsgBox(4, "环境检测", $FTP244_LocalFile & "没有初始化成功,是否继续尝试?") = 7 Then Exit
                EndIf
               
                Sleep(3000);延迟3秒再次尝试打开文件
        Until $File244_found = 1;直到文件被读取到,否则在此循环
EndFunc   ;==>getdll

Func writedb($query);写数据库
        ;连接远程电脑Mysql数据库
        _MySQL_InitLibrary()
        $MysqlConn = _MySQL_Init()
        $connected = _MySQL_Real_Connect($MysqlConn, $serverIP, $userID, $userPD, $DBname,3306);(,服务器名,ID,密码,数据库名)

        If $connected = 0 Then Exit MsgBox(16, 'Connection Error', _MySQL_Error($MysqlConn));<<<---------------------------学生机卡在这里了,弹出报错,且窗体内无错误代码

        ;执行Mysql语句————向指定记录写入数据
;~         _mysql_set_character_set($MysqlConn,"gbk");经测试,utf-8不行,gbk亦对中文支持不佳——建议不写入中文字符!
        _MySQL_Query($MysqlConn, "set names gb2312")
        _MySQL_Real_Query($MysqlConn, $query);具体执行上述命令行
        $res = _MySQL_Store_Result($MysqlConn)

        ;关闭数据库
        _MySQL_Data_Seek($res, 0)
        _MySQL_Free_Result($res)
        _MySQL_Close($MysqlConn)
        _MySQL_EndLibrary()
       
EndFunc   ;==>writedb

Func readdb($query);完成---------
        ;连接远程电脑Mysql数据库
        _MySQL_InitLibrary()
        $MysqlConn = _MySQL_Init()
        $connected = _MySQL_Real_Connect($MysqlConn, $serverIP, $userID, $userPD, $DBname,3306);(,服务器名,ID,密码,数据库名)

        If $connected = 0 Then Exit MsgBox(16, '数据库连接失败!Connection Error', _MySQL_Error($MysqlConn))

        ;执行Mysql语句————读取表中数据
        _mysql_set_character_set($MysqlConn, "GBK");_mysql_real_query($MysqlConn,"set names `gbk`")   ;设置mysql的输出编辑为 'gbk'

        _MySQL_Real_Query($MysqlConn, $query);具体执行上述命令行
        $res = _MySQL_Store_Result($MysqlConn)

        ;获取表的列、行数
        $fields = _MySQL_Num_Fields($res)
        $rows = _MySQL_Num_Rows($res)

        If $rows = 0 Then
                MsgBox(0, "来自服务器消息", "搜遍了服务器竟然未找到你刚才输入的学号...???", 6)
                GUISetState(@SW_SHOW)
        Else
                $login = 1
                ;读取数据,写入数组,并将列表显示出来
                Dim $array[$rows][$fields]
                For $k = 1 To $rows
                        $mysqlrow = _MySQL_Fetch_Row($res, $fields)
                        $lenthsStruct = _MySQL_Fetch_Lengths($res)

                        For $i = 1 To $fields
                                $length = DllStructGetData($lenthsStruct, 1, $i)
                                $fieldPtr = DllStructGetData($mysqlrow, 1, $i)
                                $data = DllStructGetData(DllStructCreate("char[" & $length & "]", $fieldPtr), 1)
                                $array[$k - 1][$i - 1] = $data
                        Next
                Next
                ;显示搜索结果
                ;_ArrayDisplay($array)
                $stu_name = $array
                $stu_college = $array
                $stu_class = $array
                ;MsgBox(0,"Test-服务器读取到的学生姓名",$stu_name,2)
        EndIf

        ;关闭数据库
        _MySQL_Data_Seek($res, 0)
        _MySQL_Free_Result($res)
        _MySQL_Close($MysqlConn)
        _MySQL_EndLibrary()
EndFunc   ;==>readdb

Func TheEnd()
        Exit
EndFunc   ;==>TheEnd


不是小灵通 发表于 2021-4-3 18:58:45

mysql数据表:
1、stu_info:主要记录学生学号,姓名等等信息(批量导入)
id
stu_num
stu_name
stu_college
stu_class
update_time


2、stu_login:主要存储登陆时学生输入的学号,以及exe获取的本机IP、机器名,并自动记录登陆时间
id
stu_num
pc_ip
pc_name
login_time

不是小灵通 发表于 2021-4-3 19:03:25

现在遇到的麻烦是普通电脑没法认识连接mysql的语句,libmysql.dll文件拷进去也不行

Xxkwwz 发表于 2021-4-3 19:40:40

{:1_183:}不好意思,SQL我也不是很懂,看你代码没什么大问题,或许可以直接保存在FTP上,以指定格式保存?然后在你的教师机上做教师端读取就可以?

不是小灵通 发表于 2021-4-3 20:06:08

你说的方法我想过,本地生成一个txt文件,记录学号,机器名,时间等等,然后传去FTP服务器存放,甚至可以自动存放到每天的文件夹
但不便让学生每次都去完整填写个人信息(学号姓名院系班级等等),也无法从数据库中读取到完整的信息,所以后期数据整理实在是太麻烦,到课率数据是需要每天上报的

我觉得还是要想下哪里原因造成学生机不能连接数据库吧

gyp2000 发表于 2021-4-3 20:27:03

测试的时候是不是在安装了MySQL的服务器上测试的?如果本机测试OK 远程访问被拒绝,那可能就是MySQL远程访问权限未设置导致的。

不是小灵通 发表于 2021-4-4 13:37:49

gyp2000 发表于 2021-4-3 20:27
测试的时候是不是在安装了MySQL的服务器上测试的?如果本机测试OK 远程访问被拒绝,那可能就是MySQL远程访 ...

不是,FTP和MYSQL是两台独立的服务器
编程是另外的两台办公电脑,AU3都安装过mysql.au3库,可以正常使用,但是做出来的exe拿到其他电脑上就显示无法连接mysql服务器了,错误代码也不显示,说明压根就没认识那些函数,自然也不能交换数据。
我甚至试着连mysql.au3拆出来当函数用,甚至整体复制到程序中,但编译出来的exe依然不能用。

不是小灵通 发表于 2021-4-4 13:43:20

程序没问题,只是普通电脑识别不了mysql库里面的函数,编译成exe时居然也没一并编译进去。。。
需要大神的金手指帮忙在哪里点一下,也许就全部OK了

kk_lee69 发表于 2021-4-4 17:40:09

不是小灵通 发表于 2021-4-4 13:43
程序没问题,只是普通电脑识别不了mysql库里面的函数,编译成exe时居然也没一并编译进去。。。
需要大神的 ...

你確定 你的 MYSQL 有開放 其他電腦的連接??    MYSQL 內定 只接受 本機的連接   不接受任何其他電腦連接

kk_lee69 发表于 2021-4-4 17:44:20

不是小灵通 发表于 2021-4-4 13:43
程序没问题,只是普通电脑识别不了mysql库里面的函数,编译成exe时居然也没一并编译进去。。。
需要大神的 ...

去下載
Navicat Premium

用你所謂的不能使用的 那台電腦看看 可否 透過 Navicat Premium 連階伺服器如果 不行 表示 你的MYSQL 根本沒有開放給別台電腦使用

gyp2000 发表于 2021-4-4 22:16:17

测试发现,你的问题就是程序当前目录没有 libmysql.dll 如果当前目录无libmysql.dll 运行的时候就会跳出 空白对话框。
程序编译为x86 然后释放libmysql.dll。
程序编译为x64需要释放libmySQL_x64.dll 到当前目录
源码当前目录存放 DLL
然后源码语句 _MySQL_InitLibrary() 前添加语句
FileInstall("libmysql.dll",@ScriptDir&"\libmysql.dll")
FileInstall("libmySQL_x64.dll",@ScriptDir&"\libmySQL_x64.dll")

这可以将外部文件装入到编译后的 AutoIt 脚本程序中。
执行时会释放文件到程序当前目录。

gyp2000 发表于 2021-4-4 22:20:35

出现这种问题的原因是你去判断的是操作系统的 X86或X64。
然后你编译的程序是x86。
x86程序需要加载的DLL是32位的,但是你仅仅向系统拷贝了X64版本的DLL。
程序运行时候自然无法找到对应版本的DLL加载。
页: [1] 2 3
查看完整版本: 【含代码】帮忙分析一下为什么exe在其他电脑上不能连接MySQL数据库