简介这份资源是面向PHP初学者与Web开发入门者的MySQL数据库连接实践项目围绕mysql_connect函数展开帮助读者理解PHP与MySQL服务器建立通信的基本流程。压缩包共15个文件约17KB以vb源码文件为主辅以resx资源文件、vbproj项目文件、sln解决方案及myapp、settings等配置项构成一个可直接在Visual Studio中打开运行的连接示例工程便于对照调试与二次修改。内容涉及连接参数设置、连接标识符判断、错误处理与连接关闭等关键环节并延伸对比mysqli与PDO两种现代扩展的用法提示mysql_connect在PHP 5.5后废弃、PHP 7.0移除的兼容性风险同时强调凭据管理与预处理语句等安全实践。目前已有215人学习适合需要快速上手数据库连接、理解新旧扩展差异并规避常见安全问题的开发者参考。1. 从一份 VB.NET 工程看 MySQL 连接它到底能跑通什么很多人看到MySQL_Connection_Project.rar这个名字第一反应是「PHP 连 MySQL 的示例代码」毕竟mysql_connect这个函数名太有年代感了。但把压缩包解开你会发现里面躺着的是Form1.vb、MySQL_Connection_Project.vbproj、MySQL_RegisterLogin.vb、My Project目录和.sln解决方案文件——这是一份标准的 VB.NET WinForms 工程不是 PHP 脚本。这个反差本身就是它最大的价值它演示的是在 .NET 桌面程序里怎么把注册、登录这类最基础的用户体系真正落到 MySQL 数据库上。如果你正在用 VB.NET 做课程设计、做内部小工具或者接手了一个老 WinForms 项目要补数据库登录模块这份工程能直接给你一套可编译、可调试的骨架。它解决的不是「MySQL 是什么」这种概念问题而是「窗体按钮点下去怎么把用户名密码写进库、怎么查出来比对」这种落地问题。适合有基础 VB.NET 语法、但对 ADO.NET 连接串和参数化查询还不熟的人。下面我按拆包、配环境、跑通、排错的顺序把这份资源讲透。2. 拆开压缩包文件清单与 VB.NET 工程结构怎么读2.1 目录里每个文件是干什么的先把压缩包解压到一个纯英文路径下中文路径在 VB.NET 老工程里偶尔会让My Project下的资源文件解析出问题。解压后你会看到这样一批文件我按作用分了三类文件/目录类型作用MySQL_Connection_Project.sln解决方案文件双击它用 Visual Studio 打开整个工程MySQL_Connection_Project.vbproj项目文件定义编译目标、引用、输出类型Form1.vb/Form1.Designer.vb/Form1.resx窗体三件套主界面逻辑、控件布局代码、窗体资源MySQL_RegisterLogin.vb业务代码注册与登录的核心逻辑连接数据库就在这里My Project目录工程配置AssemblyInfo.vb、Settings.settings、Resources.resx等bin/obj编译输出bin\Release、bin\Debug、obj\x86是历史编译产物.suo/.vbproj.user用户配置记录你本机的窗口布局和调试设置可删bin和obj里的东西是别人编译过的残留你重新生成解决方案时会覆盖不用管。真正要读的是MySQL_RegisterLogin.vb和Form1.vb。2.2 用 Visual Studio 打开并确认目标框架打开.sln后右键项目 → 属性重点看两个地方目标框架Target Framework和引用References。老工程常见的是 .NET Framework 4.x如果你机器上只装了 .NET 6/8 的 SDK打开时会提示需要安装对应的 .NET Framework 开发包。这一步别跳过框架不匹配后面全是编译错误。# 如果你习惯命令行可以用 msbuild 先探一下工程能不能被识别 msbuild MySQL_Connection_Project.sln /t:Build /p:ConfigurationDebug这条命令的作用是让 MSBuild 按 Debug 配置编译整个解决方案。/t:Build指定构建目标/p:ConfigurationDebug指定配置。如果报「找不到 Microsoft.VisualBasic.targets」之类的错基本就是 .NET Framework 开发组件没装全去 Visual Studio Installer 里勾上「.NET 桌面开发」工作负载即可。编译通过后bin\Debug下会生成.exe说明工程结构是完整的。2.3 连接字符串藏在哪VB.NET 工程里数据库连接串一般有两个去处一是My Project\Settings.settings里定义的应用程序设置二是直接硬编码在业务.vb文件里。这份工程属于后者打开MySQL_RegisterLogin.vb你会看到类似Serverlocalhost;Databasexxx;Uidroot;Pwdxxx;的字符串。先把它记下来下一步配数据库时要用。注意硬编码凭据是这份老工程的一个典型问题后面避坑章节会专门讲怎么改。3. 把连接跑起来MySQL 建库、建表与 VB.NET 连接代码3.1 先在 MySQL 里把库和表准备好工程能编译不代表能登录数据库那头得先有对应的库和表。常见做法是建一个test_db再建一张users表存账号密码。字段设计上用户名唯一、密码别存明文这是底线。-- 建库 CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; USE test_db; -- 建用户表 CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;utf8mb4是为了兼容中文用户名和特殊字符UNIQUE约束保证注册时不会出现重复账号InnoDB引擎支持事务后面如果要加注册即写日志的逻辑会方便。执行完用SELECT * FROM users;确认表结构没问题。3.2 VB.NET 里用 MySqlConnector 建立连接原工程如果用的是MySql.DataOracle 官方驱动在新版 MySQL 8 上可能会遇到认证插件不兼容的问题。我一般会换成MySqlConnector这个开源驱动兼容性和性能都更稳。在项目里通过 NuGet 安装# 在 Visual Studio 的「程序包管理器控制台」里执行 Install-Package MySqlConnector装完后在MySQL_RegisterLogin.vb顶部引入命名空间然后写连接和查询逻辑Imports MySqlConnector Public Class MySQL_Register_Login 连接字符串生产环境请从配置文件读取不要硬编码 Private Const ConnStr As String Serverlocalhost;Port3306;Databasetest_db;Uidroot;Pwd你的密码;SslModeNone; 登录校验用参数化查询防注入 Public Function CheckLogin(userName As String, passWord As String) As Boolean Dim sql As String SELECT COUNT(*) FROM users WHERE username u AND password p Using conn As New MySqlConnection(ConnStr) Using cmd As New MySqlCommand(sql, conn) 参数绑定u 和 p 会被安全转义 cmd.Parameters.AddWithValue(u, userName) cmd.Parameters.AddWithValue(p, passWord) Try conn.Open() Dim count As Integer Convert.ToInt32(cmd.ExecuteScalar()) Return count 0 Catch ex As MySqlException 连接失败或 SQL 错误都在这里别吞掉异常 MessageBox.Show(数据库错误 ex.Message) Return False End Try End Using End Using End Function End Class这段代码的关键点有三个。第一Using块保证连接和命令对象用完即释放不用手动Close。第二AddWithValue把用户输入当参数传而不是拼字符串这是防 SQL 注入的核心。第三ExecuteScalar只取第一行第一列用来做COUNT判断登录是否成立最省事。SslModeNone是本地开发图方便线上要按实际证书情况调整。3.3 注册逻辑与窗体按钮绑定注册就是把上面反过来先查用户名是否存在不存在就插入。在Form1.vb的按钮点击事件里调用Private Sub btnRegister_Click(sender As Object, e As EventArgs) Handles btnRegister.Click Dim biz As New MySQL_Register_Login() If biz.UserExists(txtUser.Text) Then MessageBox.Show(该用户名已被注册) Return End If If biz.RegisterUser(txtUser.Text, txtPwd.Text) Then MessageBox.Show(注册成功请登录) Else MessageBox.Show(注册失败请查看日志) End If End SubUserExists和RegisterUser两个方法按 3.2 的写法扩展即可插入用INSERT INTO users (username, password) VALUES (u, p)。密码这里演示用的是明文实际项目务必先做哈希如 BCrypt再入库这一点在避坑章节展开。4. 连接失败排查从报错信息定位到具体环节4.1 现象提示「Unable to connect to any of the specified MySQL hosts」原因通常有三层MySQL 服务没启动、端口不对、或者主机地址写错。先在服务里确认 MySQL 正在运行再用netstat -ano | findstr 3306看端口是否在监听。如果服务在跑但端口不通检查my.ini里的bind-address是不是被限制成了127.0.0.1而你用了别的地址。解决方式是把连接串的Server改成127.0.0.1试一次排除 DNS 解析干扰。4.2 现象报「Authentication method caching_sha2_password is not supported」这是 MySQL 8 默认认证插件和旧驱动不匹配的经典问题。原因是你用的MySql.Data版本太老不认识caching_sha2_password。解决办法有两个一是按 3.2 换成MySqlConnector二是把该用户的认证方式改回mysql_native_passwordALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;改完记得重启连接FLUSH PRIVILEGES让权限表立即生效。4.3 现象中文用户名注册后变成乱码或问号原因是数据库、表、连接三处的字符集不一致。检查SHOW VARIABLES LIKE character%;确保character_set_server和character_set_database都是utf8mb4。连接串里也可以显式加CharacterSetutf8mb4;。表建的时候如果漏了DEFAULT CHARSETutf8mb4用ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4;补救。4.4 现象编译报「类型 MySqlConnection 未定义」说明 NuGet 包没装成功或者Imports写错了。先确认「引用」里能看到MySqlConnector再确认文件顶部是Imports MySqlConnector而不是Imports MySql.Data.MySqlClient。两个驱动命名空间不同混用必报错。如果项目里同时装了新旧两个驱动建议卸掉MySql.Data避免类型冲突。4.5 现象登录一直返回 False但数据库里明明有数据先别怀疑代码用SELECT * FROM users WHERE username 你测试的账号;在 MySQL 客户端里手动查一次。如果查得到问题多半在参数传递上——比如窗体文本框里多了空格。在CheckLogin里加一句userName userName.Trim()再传参。另外确认密码字段比对时没有大小写或编码差异。5. 从能跑到能用凭据外置、密码哈希与连接池三个进阶动作5.1 把连接串从代码里挪出去硬编码凭据是这份工程最该改的地方。VB.NET 里可以用App.config存连接串代码里通过ConfigurationManager.ConnectionStrings读!-- App.config -- configuration connectionStrings add nameMySqlConn connectionStringServerlocalhost;Databasetest_db;Uidapp_user;Pwd强密码;SslModeNone; providerNameMySqlConnector / /connectionStrings /configurationImports System.Configuration Private Function GetConnStr() As String Return ConfigurationManager.ConnectionStrings(MySqlConn).ConnectionString End Function这样换环境只改配置文件不用重新编译。数据库账号也别用 root单独建一个只有SELECT、INSERT权限的app_user把权限收到最小。5.2 密码哈希别让数据库泄露等于账号泄露明文存密码的后果不用多说。VB.NET 里可以用BCrypt.Net-Next这个 NuGet 包注册时哈希、登录时校验Imports BCrypt.Net 注册存哈希 Dim hashed As String BCrypt.HashPassword(txtPwd.Text) 入库时 password 字段存 hashed 登录校验 Dim stored As String GetStoredHash(userName) 从库里取出哈希 Dim ok As Boolean BCrypt.Verify(txtPwd.Text, stored)HashPassword每次生成的盐不同所以同一个密码两次哈希结果不一样这是正常的。Verify会自动从存储的哈希里提取盐来比对你不需要自己管盐。这一步做完即使数据库被拖库攻击者也拿不到明文密码。5.3 连接池别每次点击都重开连接MySqlConnector默认开启连接池但前提是你用相同的连接字符串。如果你在代码里动态拼串比如带时间戳池就失效了。正确做法是连接串保持稳定Open时从池里取、Dispose时归还。可以在连接串里显式控制池行为Serverlocalhost;Databasetest_db;Uidapp_user;Pwdxxx;Poolingtrue;MinimumPoolSize1;MaximumPoolSize10;MinimumPoolSize是池里保底连接数MaximumPoolSize是上限。桌面程序并发不高10 足够。设太大反而占数据库连接数。验证池是否生效可以在 MySQL 里执行SHOW STATUS LIKE Threads_connected;反复登录退出看连接数是否稳定而不是一路涨。5.4 一个我自己的习惯从那以后我每次接手这种带数据库连接的 WinForms 老工程都强制先做三件事把连接串挪进配置文件、把 root 换成最小权限账号、把明文密码换成哈希。这三步不做完功能跑通了我也不敢往下写业务。希望这份拆解能帮到你少走几个连接失败的弯路。本文还有配套的精品资源点击获取
