找回密码  加入

AUTOIT CN

搜索
查看: 291|回复: 35

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

[复制链接]
发表于 2021-4-2 15:40:29 | 显示全部楼层 |阅读模式
本帖最后由 不是小灵通 于 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文件夹拷贝进去,然而还是不行

发表于 2021-4-3 09:27:03 | 显示全部楼层
代码不贴出来,全靠猜?
 楼主| 发表于 2021-4-3 18:51:17 | 显示全部楼层
Xxkwwz 发表于 2021-4-3 09:27
代码不贴出来,全靠猜?
  1. #Region ;**** 参数创建于 ACNWrapper_GUI ****
  2. #AutoIt3Wrapper_Icon=C:\Windows\system32\SHELL32.dll
  3. #AutoIt3Wrapper_Outfile=C:\Users\Administrator\Desktop\qiandao3306.exe
  4. #AutoIt3Wrapper_UseUpx=n
  5. #EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
  6. #include <ButtonConstants.au3>
  7. #include <EditConstants.au3>
  8. #include <GUIConstantsEx.au3>
  9. #include <StaticConstants.au3>
  10. #include <WindowsConstants.au3>

  11. #include <array.au3>
  12. #include "mysql.au3"
  13. ;#include <Date.au3>
  14. ;#include <Timers.au3>
  15. #include <FTPEx.au3>

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

  25. ;管理服务器参数
  26. Global $serverIP = "192.168.0.3"
  27. Global $conname = "2021"
  28. Global $userID = "abc2"
  29. Global $userPD = "abc2"
  30. Global $DBname = "abc2"

  31. Local $Ver = "V0.0.0.0"
  32. Local $pc_ip = ""
  33. Local $pc_name = ""
  34. Local $Input1 = ""
  35. Local $Input2 = ""
  36. Local $login = 0

  37. Global $stu_num = ""
  38. Global $stu_name
  39. Global $stu_college = ""
  40. Global $stu_class = ""
  41. Global $order_code = ""


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


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

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

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

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

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

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

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

  90. Func myPC()
  91.         $stu_num = GUICtrlRead($Input1)
  92.         $order_code = GUICtrlRead($Input2)
  93.         $pc_ip = @IPAddress1;获取本机IP
  94.         $pc_name = @ComputerName;获取本机机器名
  95. EndFunc   ;==>myPC

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

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

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

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

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

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

  131.         ;关闭数据库
  132.         _MySQL_Data_Seek($res, 0)
  133.         _MySQL_Free_Result($res)
  134.         _MySQL_Close($MysqlConn)
  135.         _MySQL_EndLibrary()
  136.        
  137. EndFunc   ;==>writedb

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

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

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

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

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

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

  161.                         For $i = 1 To $fields
  162.                                 $length = DllStructGetData($lenthsStruct, 1, $i)
  163.                                 $fieldPtr = DllStructGetData($mysqlrow, 1, $i)
  164.                                 $data = DllStructGetData(DllStructCreate("char[" & $length & "]", $fieldPtr), 1)
  165.                                 $array[$k - 1][$i - 1] = $data
  166.                         Next
  167.                 Next
  168.                 ;显示搜索结果
  169.                 ;_ArrayDisplay($array)
  170.                 $stu_name = $array[0][2]
  171.                 $stu_college = $array[0][3]
  172.                 $stu_class = $array[0][4]
  173.                 ;MsgBox(0,"Test-服务器读取到的学生姓名",$stu_name,2)
  174.         EndIf

  175.         ;关闭数据库
  176.         _MySQL_Data_Seek($res, 0)
  177.         _MySQL_Free_Result($res)
  178.         _MySQL_Close($MysqlConn)
  179.         _MySQL_EndLibrary()
  180. EndFunc   ;==>readdb

  181. Func TheEnd()
  182.         Exit
  183. 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文件拷进去也不行
发表于 2021-4-3 19:40:40 | 显示全部楼层
不好意思,SQL我也不是很懂,看你代码没什么大问题,或许可以直接保存在FTP上,以指定格式保存?然后在你的教师机上做教师端读取就可以?
 楼主| 发表于 2021-4-3 20:06:08 | 显示全部楼层
你说的方法我想过,本地生成一个txt文件,记录学号,机器名,时间等等,然后传去FTP服务器存放,甚至可以自动存放到每天的文件夹
但不便让学生每次都去完整填写个人信息(学号姓名院系班级等等),也无法从数据库中读取到完整的信息,所以后期数据整理实在是太麻烦,到课率数据是需要每天上报的

我觉得还是要想下哪里原因造成学生机不能连接数据库吧
发表于 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了
发表于 2021-4-4 17:40:09 | 显示全部楼层
不是小灵通 发表于 2021-4-4 13:43
程序没问题,只是普通电脑识别不了mysql库里面的函数,编译成exe时居然也没一并编译进去。。。
需要大神的 ...

你確定 你的 MYSQL 有開放 其他電腦的連接??    MYSQL 內定 只接受 本機的連接   不接受任何其他電腦連接
发表于 2021-4-4 17:44:20 | 显示全部楼层
不是小灵通 发表于 2021-4-4 13:43
程序没问题,只是普通电脑识别不了mysql库里面的函数,编译成exe时居然也没一并编译进去。。。
需要大神的 ...

去下載
Navicat Premium

用你所謂的不能使用的 那台電腦  看看 可否 透過 Navicat Premium 連階伺服器  如果 不行 表示 你的MYSQL 根本沒有開放給別台電腦使用
发表于 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 脚本程序中。
执行时会释放文件到程序当前目录。
发表于 2021-4-4 22:20:35 | 显示全部楼层
出现这种问题的原因是你去判断的是操作系统的 X86或X64。
然后你编译的程序是x86。
x86程序需要加载的DLL是32位的,但是你仅仅向系统拷贝了X64版本的DLL。
程序运行时候自然无法找到对应版本的DLL加载。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2021-4-13 06:51 , Processed in 0.156250 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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