C# MySQL 提交事务不起作用(连接必须有效且打开才能提交事务)

标签 c# mysql database winforms transactions

我有一个类可以帮助我连接到数据库启动事务并运行一些查询,一旦完成所有查询,我就会提交/回滚事务。

这是我的课

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using MySql.Data.MySqlClient;
using System.Windows.Forms;

namespace RM
{
    public class dbConnetionWT
    {
        //private OdbcConnection conn; 
        private static readonly string mServer = "localhost";
        private static readonly string mDatabase = "pos";
        private static readonly string mUid = "root";
        private static readonly string mPassword = "";
        private static readonly string mPort = "3306";
        private string conn_string = String.Format("server={0};user={1};database={2};port={3};password={4};", mServer, mUid, mDatabase, mPort, mPassword);
        private MySqlConnection conn;
        private MySqlTransaction trans;

        public dbConnetionWT()
        {
            this.conn = new MySqlConnection(this.conn_string);
            try
            {
                this.conn.Open();
            }
            catch
            {
                Common.Alert("Database Server is not reachable", "SQL Error");
            }
        }

        public void End()
        {
            try
            {
                this.conn.Close();
            }
            catch
            {
                Common.Alert("Database Server is not reachable", "SQL Error");
            }
        }


        public void BeginTransaction()
        {
            this.trans = this.conn.BeginTransaction();
        }

        public void Commit()
        {
            try
            {
                this.trans.Commit();
            }
            catch(Exception ex)
            {
                Common.Alert(ex.ToString(), "SQL Error");
            }

        }

        public void Rollback()
        {
            try
            {
                this.trans.Rollback();
            }
            catch (Exception ex)
            {
                Common.Alert(ex.ToString(), "SQL Error");
            }


        }


        // query the data base
        public IEnumerable<T> getData<T>(string query, List<MySqlParameter> pars, Func<IDataRecord, T> transform)
        {
            using (this.conn)
            using (var cmd = new MySqlCommand(query, conn))
            {
                if (pars != null)
                {
                    foreach (MySqlParameter p in pars)
                    {
                        cmd.Parameters.Add(p);
                    }
                }

                using (var rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        yield return transform(rdr);
                    }
                }
            }
        }

        // query the data base
        public T getValue<T>(string query, List<MySqlParameter> pars)
        {
            T value;
            using (this.conn)
            using (var cmd = new MySqlCommand(query, conn))
            {
                if (pars != null)
                {
                    foreach (MySqlParameter p in pars)
                    {
                        cmd.Parameters.Add(p);
                    }
                }

                try
                {
                    object rawValue = cmd.ExecuteScalar();

                    if (rawValue != null)
                    {
                        value = (T)Convert.ChangeType(rawValue, typeof(T));
                    }
                    else
                    {
                        value = default(T);
                    }
                }
                catch (Exception ex)
                {
                    Common.Alert(ex.ToString(), "SQL Error");
                    value = default(T);
                    this.trans.Rollback();
                }
            }
            return value;
        }

        public bool processQuery(string strSQL, List<MySqlParameter> pars)
        {
            bool toReturn = true;

            using (this.conn)
            using (var cmd = new MySqlCommand(strSQL, conn))
            {

                if (pars != null)
                {
                    foreach (MySqlParameter param in pars)
                    {
                        cmd.Parameters.Add(param);
                    }
                }

                try
                {
                    cmd.ExecuteNonQuery();
                }
                catch (MySqlException ex)
                {
                    Common.Alert(ex.ToString(), "SQL Error");
                    toReturn = false;
                    this.trans.Rollback();
                }
            }

            return toReturn;
        }
    }
}

这是我遇到问题时如何使用它

 bool hasSqlError = false;
 string sql2 = " INSERT INTO products "
 + " (productUPC, productName, price, createdBy, departmentID, vendorID, productDescription) "
 + " VALUES('123', 'Name', '29.99', '1', '2', '3', 'This is a test')";

if (!dbwt.processQuery(sql2, null))
{
    hasSqlError = true;
}

if (!hasSqlError)
{
    dbwt.Commit();
    dbwt.End();
    this.Close();
}
else
{

    dbwt.Rollback();
}

但是我在尝试提交dbwt.Commit();时不断收到错误

这是我得到的异常错误 enter image description here

如何解决这个问题?我不明白为什么即使我在构造函数中打开连接也会收到此错误?

最佳答案

您在 processQuery() 方法中有一个 using (this.conn),并且 using 语句会导致您连接到被关闭。所以错误消息是有道理的。

您已经在 End() 方法中显式关闭连接,因此请省略以下行:

using (this.conn)

另外,FWIW,您可能还想确保在回滚后也关闭连接:

if (!hasSqlError)
{
    dbwt.Commit();
}
else
{
    dbwt.Rollback();
}
dbwt.End();
this.Close();

或者,即使在抛出异常的情况下也确保连接关闭:

try
{
    if (!hasSqlError)
    {
        dbwt.Commit();
    }
    else
    {
        dbwt.Rollback();
    }
    this.Close();
}
finally
{
    dbwt.End();
}

关于C# MySQL 提交事务不起作用(连接必须有效且打开才能提交事务),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27895103/

相关文章:

c# - Entity Framework DateTime.Now - 7 天 C#

c# - 为 Windows 应用程序实现 webrtc 数据通道

database - 无法从 azure 上部署的 Web 应用程序保存到 azure 上部署的数据库

mysql - 如何在 MySQL 5.7 中创建六字符密码

java - 如何将Oracle9i与JAVA或JSP集成?

c# - 从数据库获取Guid

c# - Web API 无法引用 DLL

php - MySql - 不同服务器中表的大小写敏感问题

php - 从 mysql 表中的每一行中删除重复单词的最佳方法

mysql - Windows 10 上的 MAMP 4.1.0 无法启动 MySQL