Windows Forms中MySQL插入的.NET Framework类型转换问题
解决思路与代码实现
你当前直接拼接SQL字符串的方式存在SQL注入风险,且缺失类型转换逻辑,这是核心问题。正确方案是采用参数化查询,既能解决类型转换问题,又能保证操作安全。
核心步骤
- 先校验字典
dict与值数组my_values的长度是否匹配,避免索引越界 - 遍历每个列,根据字典中存储的目标数据类型,将对应字符串值转换为匹配类型
- 使用
MySqlCommand的参数集合管理参数,而非直接拼接SQL内容
修正后的代码示例
using MySql.Data.MySqlClient; // 假设已存在数据库连接对象conn string str = textBox1.Text; my_values = str.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); // 移除空项避免错误 // 校验列数与值数量是否匹配 if (dict.Count != my_values.Length) { MessageBox.Show("输入值数量与列数量不匹配!"); return; } // 构建SQL的列名部分,MySQL用反引号包裹列名处理关键字 List<string> columnNames = new List<string>(); foreach (var kvp in dict) { columnNames.Add($"`{kvp.Key}`"); } string columnsPart = string.Join(", ", columnNames); // 构建参数占位符部分,用@+列名作为参数标识 List<string> paramPlaceholders = new List<string>(); foreach (var kvp in dict) { paramPlaceholders.Add($"@{kvp.Key}"); } string paramsPart = string.Join(", ", paramPlaceholders); // 拼接完整SQL语句 string addQuery = $"INSERT INTO `{name_of_table}` ({columnsPart}) VALUES ({paramsPart})"; // 创建命令对象并添加参数 using MySqlCommand cmd = new MySqlCommand(addQuery, conn); for (int i = 0; i < dict.Count; i++) { var kvp = dict.ElementAt(i); string valueStr = my_values[i].Trim(); Type targetType = kvp.Value as Type; // 确保字典存储的是Type类型 object convertedValue; try { // 针对常见类型做显式转换,可按需扩展 if (targetType == typeof(DateTime)) { convertedValue = DateTime.Parse(valueStr); } else if (targetType == typeof(int)) { convertedValue = int.Parse(valueStr); } else if (targetType == typeof(decimal)) { convertedValue = decimal.Parse(valueStr); } else if (targetType == typeof(bool)) { convertedValue = bool.Parse(valueStr); } else if (targetType == typeof(string)) { convertedValue = valueStr; } else { // 基础类型通用转换逻辑 convertedValue = Convert.ChangeType(valueStr, targetType); } } catch (FormatException) { MessageBox.Show($"第{i+1}个值格式错误,无法转换为{targetType.Name}类型!"); return; } cmd.Parameters.AddWithValue($"@{kvp.Key}", convertedValue); } // 执行插入操作 try { conn.Open(); int rowsAffected = cmd.ExecuteNonQuery(); MessageBox.Show($"成功插入{rowsAffected}条数据!"); } catch (MySqlException ex) { MessageBox.Show($"数据库错误:{ex.Message}"); } finally { if (conn.State == ConnectionState.Open) { conn.Close(); } }
关键说明
- 类型转换:针对常用数据类型做了显式转换处理,避免通用转换逻辑的异常,可根据实际使用的类型扩展分支。
- 参数化查询:彻底规避SQL注入风险,数据库驱动会自动处理类型匹配,无需手动添加单引号等格式符号。
- 列名处理:用MySQL标准的反引号``包裹列名,解决
To这类关键字列名的语法问题。
内容的提问来源于stack exchange,提问作者Lion
相关产品推荐
相关产品推荐

