C#连接MySQL报Connection Property must not be null异常咨询
错误根因
该异常的直接触发原因是你初始化MySqlCommand时,未给命令对象绑定有效的数据库连接,导致MySqlCommand.Connection属性为null,执行查询时就会抛出这个错误。
你当前代码中初始化Command的写法是var cmd = new MySqlCommand("SELECT _Password FROM * WHERE email=" + enter_email);,只传入了SQL语句,没有关联已经打开的connection对象,这是报错的核心原因。
除了直接触发报错的问题外,你的代码还有多处会导致运行异常的问题,需要同步修复:
- SQL语法错误:
FROM *是非法写法,FROM关键字后必须指定要查询的具体表名,不能直接使用通配符 - 存在SQL注入与语法错误风险:直接拼接用户输入的邮箱内容到SQL语句中,一旦输入内容包含单引号等特殊字符就会导致SQL执行失败,同时存在被SQL注入攻击的风险,必须改用参数化查询
- 数据读取逻辑错误:
ExecuteReaderAsync返回的DataReader初始指针位于第一行记录之前,必须先调用Read()方法移动指针、判断是否存在匹配记录,才能读取字段值;你当前的逻辑没有处理邮箱不存在、查询无结果的场景,直接读取字段会触发新的异常 - 资源释放不规范:
MySqlCommand、MySqlDataReader都属于非托管资源,应该放入using块中自动释放,不需要手动调用connection.Close(),外层连接的using块会在代码执行结束后自动关闭并释放连接
修复后的参考代码如下:
async void LoginClick(object sender, EventArgs args) { var connectionStr = "server=myip;user=app;database=travel_logger;port=3306;password=app;default command timeout=20;"; string enter_email = Email.Text; using (var connection = new MySqlConnection(connectionStr)) { await connection.OpenAsync(); // 初始化Command时同时传入SQL语句和连接对象,修复Connection为null的问题 // 注意将SQL语句中的user_table替换为你项目中实际存储用户账号的表名 using (var cmd = new MySqlCommand("SELECT _Password FROM user_table WHERE email=@email", connection)) { // 使用参数化查询,避免SQL注入和特殊字符导致的语法错误 cmd.Parameters.AddWithValue("@email", enter_email); using (var reader = await cmd.ExecuteReaderAsync()) { // 先判断是否查询到匹配的用户记录 if (await reader.ReadAsync()) { string data_password = reader.GetString(0); if (data_password == Password.Text) { await Navigation.PushAsync(new AboutPage()); } else { await DisplayAlert("Login Error", "Incorrect email or password", "Okay"); } } else { await DisplayAlert("Login Error", "Incorrect email or password", "Okay"); } } } } }
注意:生产环境禁止明文存储用户密码,上述代码仅做逻辑演示,正式上线前请替换为加盐哈希的密码校验逻辑,避免数据泄露。
内容的提问来源于stack exchange,提问作者Jsheerin
相关产品推荐
相关产品推荐

