我希望有人可以检查我是如何使用 Transaction with MySql 的上下文。我相信这应该适用于下面的大纲。有人可以看看我的代码并告诉我我做的是否正确吗?谢谢。
我相信这应该:
- 实例化数据库连接。
- 遍历给定 DataTable 的 DataTable 行。
- 检查表是否存在,如果不存在,将执行创建表。
- 执行带有信息参数的插入命令到新创建的或现有的表中。
提交事务然后关闭连接。
//Open the SQL Connection var dbConnection = new MySqlConnection(GetConnectionString(WowDatabase)); dbConnection.Open(); //Instantiate the Command using (var cmd = new MySqlCommand()) { //Create a new Transaction using (var transaction = dbConnection.BeginTransaction()) { uint lastId = 999999; for (int i = 0; i < dt.Rows.Count; i++) { //var identifier = dt.Rows[i].Field<int>("Identifier"); var id = dt.Rows[i].Field<uint>("Entry"); var name = dt.Rows[i].Field<string>("Name"); var zone = dt.Rows[i].Field<uint>("ZoneID"); var map = dt.Rows[i].Field<uint>("MapID"); var state = dt.Rows[i].Field<Enums.ItemState>("State"); var type = dt.Rows[i].Field<Enums.ObjectType>("Type"); var faction = dt.Rows[i].Field<Enums.FactionType>("Faction"); var x = dt.Rows[i].Field<float>("X"); var y = dt.Rows[i].Field<float>("Y"); var z = dt.Rows[i].Field<float>("Z"); string dataTableName = "entry_" + id; //Create Table if it does not exist. if (id != lastId) { cmd.CommandText = $"CREATE TABLE IF NOT EXISTS `{dataTableName}` (" + "`identifier` int NOT NULL AUTO_INCREMENT COMMENT 'Auto Incriment Identifier' ," + "`zone_id` int NULL COMMENT 'Zone Entry' ," + "`x_axis` float NULL COMMENT 'X Axis on Map' ," + "`y_axis` float NULL COMMENT 'Y Axis on Map' ," + "`z_axis` float NULL COMMENT 'Z Axis on Map' ," + "`situation` enum('') NULL COMMENT 'Location of the item. Underground, Indoors, Outdoors)' ," + "`faction` enum('') NULL COMMENT 'Specifies the Faction which can safely access the item.' ," + "PRIMARY KEY(`identifier`)" + ")"; cmd.ExecuteNonQuery(); lastId = id; } //Create command to execute the insertion of Data into desired Table cmd.CommandText = $"INSERT INTO [{dataTableName}] " + "([identifier], [zone_id], [x_axis], [y_axis], [z_axis], [situation], [faction], [Create_Date], [Update_Date]) " + "VALUES (@Identifier, @Zone_Id, @X_Axis, @Y_Axis, @Z_Axis, @Situation, @Faction, @Create_Date, @Update_Date)"; //Add data value with Parameters. cmd.CommandType = CommandType.Text; //cmd.Parameters.AddWithValue("@Identifier", identifier); cmd.Parameters.AddWithValue("@Identifier", id); cmd.Parameters.AddWithValue("@Zone_Id", zone); cmd.Parameters.AddWithValue("@X_Axis", x); cmd.Parameters.AddWithValue("@Y_Axis", y); cmd.Parameters.AddWithValue("@Z_Axis", z); cmd.Parameters.AddWithValue("@Situation", state); cmd.Parameters.AddWithValue("@Faction", faction); cmd.Parameters.AddWithValue("@Create_Date", DateTime.Now.Date); cmd.Parameters.AddWithValue("@Update_Date", DateTime.Now.Date); cmd.ExecuteNonQuery(); } //for (int i = 0; i < dt.Rows.Count; i++) //Commit the Transaction transaction.Commit(); } //using (var transaction = dbConnection.BeginTransaction()) } //using (var cmd = new MySqlCommand()) //Close the Connection dbConnection.Close();
最佳答案
我认为这不会(如预期的那样)与 MySql 一起工作。有一些语句会导致隐式提交 - CREATE TABLE
就是其中之一。
关于c# - MySQL -> 事务上下文 -> 代码审查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36460906/