C#操作MySQL多表插入时提示commandText属性未正确初始化
错误原因
The commandText property is not properly initialized错误触发点在循环末尾的cmd.ExecuteNonQuery():你在循环外初始化的cmd对象只绑定了数据库连接,从未给CommandText属性赋值任何待执行的SQL语句,执行时引擎找不到有效命令直接抛出初始化异常。
你的代码还存在几个会导致功能异常的连带问题:
- 向
user表插入数据的cmd1调用ExecuteScalar()获取自增主键时,普通INSERT语句默认不返回查询结果,你拿到的永远是无效值,无法正确关联profile表数据 - 全局
cmd对象在每次循环中重复添加同名参数,第二次循环开始就会触发参数重复定义的错误 - 逻辑冗余:每次循环先用固定值
John Doe插入一组user、profile数据,之后又生成Faker随机值尝试调用无SQL的cmd执行,会产生大量无效脏数据 - 两张表的写入操作没有事务包裹,任意一步执行失败都会出现数据不一致(比如user写入成功但profile写入失败,残留孤立的user记录)
- 数据库连接、命令对象未做资源释放,长期运行会耗尽连接池资源
修复实现
核心调整点:
- 删除无用的全局
cmd、adapter对象,每次操作的命令明确指定SQL语句 - 插入user表后拼接
SELECT 2088100;获取刚生成的自增userID - 用事务包裹单次循环内的两张表写入操作,保证原子性
- 用
using语法自动释放数据库连接、命令、事务对象,避免资源泄漏 - 移除重复插入逻辑,统一使用Faker生成的随机值写入
using MySql.Data.MySqlClient; using System.Diagnostics; using Faker; class SQLCreate { public void create(int entries) { string connectionString = "server=localhost;uid=root;pwd=;database=databaseassignment;"; int entryValue = entries; Stopwatch stopw = new Stopwatch(); stopw.Start(); try { // using自动释放连接资源 using (MySqlConnection conn = new MySqlConnection(connectionString)) { conn.Open(); for (int i = 0; i < entryValue; i++) { // 开启事务,保证两张表写入同时成功或同时回滚 using (MySqlTransaction trans = conn.BeginTransaction()) { try { string firstName = Name.First(); string lastName = Name.Last(); string profileName = Name.FullName(); // 插入user并返回自增ID,注意末尾加SELECT 2088100 string userInsertSql = @"INSERT INTO user (firstName, lastName) VALUES (@firstName, @lastName); SELECT 2088100;"; using (MySqlCommand cmdUser = new MySqlCommand(userInsertSql, conn, trans)) { cmdUser.Parameters.AddWithValue("@firstName", firstName); cmdUser.Parameters.AddWithValue("@lastName", lastName); // 执行Scalar拿到刚插入的自增userID int userId = Convert.ToInt32(cmdUser.ExecuteScalar()); // 插入关联的profile数据 string profileInsertSql = @"INSERT INTO profile (userId, profileName) VALUES (@userId, @profileName);"; using (MySqlCommand cmdProfile = new MySqlCommand(profileInsertSql, conn, trans)) { cmdProfile.Parameters.AddWithValue("@userId", userId); cmdProfile.Parameters.AddWithValue("@profileName", profileName); cmdProfile.ExecuteNonQuery(); } } // 所有操作成功提交事务 trans.Commit(); } catch { // 出错回滚,避免脏数据 trans.Rollback(); throw; } } } } stopw.Stop(); Console.WriteLine(" Time elapsed: {0} ", stopw.Elapsed); } catch (MySqlException ex) { Console.WriteLine($"数据库执行错误:{ex.Message}"); } } }
扩展提示
后续如果需要扩展写入第三张表,只需要在同一个事务块内,拿到前一步生成的自增ID后,新增对应表的插入命令即可,不需要改动整体逻辑结构。
内容的提问来源于stack exchange,提问作者Dunga
相关产品推荐
相关产品推荐

