You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用HeidiSQL向MySQL插入数据失败,求故障排查思路

解决HeidiSQL中数据插入失败的问题

我帮你排查下这段代码里的几个关键问题,这些应该就是你插入数据失败的核心原因:

  • SQL语句中参数被错误包裹了单引号
    你写的SQL里把参数用单引号括起来了:VALUES ('@loginname', '@email', ...),这会让MySQL把@loginname当成一个普通的字符串字面量,而不是去读取你通过Parameters.Add添加的参数值。正确写法要去掉单引号:

    INSERT INTO `user` (Loginname, Email, Algo, Stretch, `Hash`, Salt) VALUES (@loginname, @email, @algo, @stretch, @hash, @salt);
    
  • 参数类型与数据库字段不匹配
    你的stretch字段是int类型,但代码里把参数类型设成了MySqlDbType.VarChar,这会导致类型转换错误,应该改成MySqlDbType.Int32;另外hashsalt是char类型,你当前用的MySqlDbType.VarChar虽然可能兼容,但最好换成MySqlDbType.Char来匹配字段类型,避免潜在问题:

    cmd2.Parameters.Add("@stretch", MySqlDbType.Int32).Value = stretch;
    cmd2.Parameters.Add("@hash", MySqlDbType.Char).Value = hash;
    cmd2.Parameters.Add("@salt", MySqlDbType.Char).Value = salt;
    
  • 错误使用了ExecuteReader()执行插入操作
    ExecuteReader()是用来执行查询语句、返回结果集的,插入属于非查询操作,应该用ExecuteNonQuery(),它会返回受影响的行数,方便你判断插入是否成功:

    int rowsAffected = cmd2.ExecuteNonQuery();
    if (rowsAffected > 0) {
        // 插入成功的逻辑
    } else {
        // 插入失败的逻辑
    }
    
  • 变量名拼写错误
    你定义的命令对象是cmd2,但执行时写的是cmd.ExecuteReader(),这里cmd是未定义的变量,会直接抛出运行时错误,得改成cmd2开头的调用(不过更推荐换成上面的ExecuteNonQuery)。

修正后的完整代码示例

MySqlCommand cmd2 = dbConStr.CreateCommand();
cmd2.CommandText = "INSERT INTO `user` (Loginname, Email, Algo, Stretch, `Hash`, Salt) VALUES (@loginname, @email, @algo, @stretch, @hash, @salt);";

cmd2.Parameters.Add("@loginname", MySqlDbType.VarChar).Value = loginname;
cmd2.Parameters.Add("@email", MySqlDbType.VarChar).Value = email;
cmd2.Parameters.Add("@algo", MySqlDbType.VarChar).Value = algo;
cmd2.Parameters.Add("@stretch", MySqlDbType.Int32).Value = stretch;
cmd2.Parameters.Add("@hash", MySqlDbType.Char).Value = hash;
cmd2.Parameters.Add("@salt", MySqlDbType.Char).Value = salt;

try {
    int rows = cmd2.ExecuteNonQuery();
    if (rows > 0) {
        Console.WriteLine("数据插入成功!");
    } else {
        Console.WriteLine("数据插入失败,未影响任何行。");
    }
} catch (MySqlException ex) {
    // 捕获异常查看具体错误信息,这对排查问题很重要
    Console.WriteLine($"插入出错:{ex.Message}");
} finally {
    cmd2.Dispose();
}

另外,建议你开启HeidiSQL的查询日志,或者在代码里捕获异常输出详细信息,这样能更直接地看到MySQL返回的错误提示,快速定位问题。

内容的提问来源于stack exchange,提问作者catcat

火山引擎 最新活动