c# - MySQL -> 事务上下文 -> 代码审查

标签 c# mysql

我希望有人可以检查我是如何使用 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 就是其中之一。

http://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

关于c# - MySQL -> 事务上下文 -> 代码审查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36460906/

相关文章:

mysql - 使用 session 变量时如何在存储过程中运行此查询

在 cleardb 中执行和插入时出现 PHP PDO 错误

php - 延长更新,有这样的事吗?

c# - 插入文件路径

c# - 如何构建F#类型的业务规则?

mysql - 替换wp_postmeta的meta_value中与特定meta_key相关的URL

java - 不支持在线程中执行 MySQL 存储过程并获取可调用语句

c# - 使用反射的通用列表

C# 相当于 Form.Activate 事件?

c# - SHA 计算随机长度的哈希值