这一类的错误,仔细查看代码,发现下面的问题:
下面的代码是负责创建数据库连接,同时打开或者不打开数据库事务(下面的代码是客户的错误代码)。
namespace haierp.DataAccessLayer
{
  public sealed class SqlHelper
    {
        private static SqlConnection conn = null;
        private static SqlCommand command = null;
        private static SqlTransaction tran = null;
        public static SqlCommand GetCommand(string connectstr)
        {
            conn = new SqlConnection(connectstr);
            conn.Open();
            command = conn.CreateCommand();
            command.CommandTimeout = 60000;
            return command;
        }
        public static bool EndCommand()
        {
            bool state = false;
            try
            {
                command.Connection.Close();
                state = true;
            }
            catch
            {
                state = false;
                conn.Close();
            }
            return state;
        }
        public static bool SqlCommit(SqlCommand command)
        {
            bool state = false;
            try
            {
                command.Transaction.Commit();
                state = true;
            }
            catch
            {
                state = false;
            }
            finally
            {
                command.Connection.Close();
                command.Connection = null;
                command = null;
            }
            return state;
        }
        public static bool SqlRollback(SqlCommand command)
        {
            bool state = false;
            try
            {
                command.Transaction.Rollback();
                state = true;
            }
            catch
            {
                state = false;
            }
            finally
            {
                command.Connection.Close();
                command.Connection = null;
                command = null;
            }
            return state;
        }
    }
}
由于这是用于ASP .NET的共用代码,因此存在多个客户并发访问的问题,同时由于使用了上面红色标注的静态
私有变量,因此多个客户ASP线程是共享SqlConnection,SqlCommand,SqlTransaction,于是一个线程
生成的conn,就可能被别的线程关闭,一个线程生成的Transaction,就可能被别的线程提交或者回滚。
正确的做法是:取消使用这里的静态私有变量,采用动态对象,或者函数参数的形式,以保证各线程使用自己私有的
SqlConnection,SqlCommand,SqlTransaction对象,避免彼此干扰。如下所示是正确的代码:
namespace haierp.DataAccessLayer
{
    public sealed class SqlHelper
    {
        //private static SqlConnection conn = null;
        //private static SqlCommand command = null;
        //private static SqlTransaction tran = null;
        public static SqlCommand GetCommand(string connectstr)
        {
            SqlConnection conn = new SqlConnection(connectstr);
            conn.Open();
            SqlCommand command = conn.CreateCommand();
            command.CommandTimeout = 60000;
            return command;
        }
        public static SqlCommand GetTranCommand(string connectionString)
        {
            SqlConnection conn = new SqlConnection(connectionString);
            conn.Open();
            SqlCommand command = conn.CreateCommand();
            SqlTransaction tran = conn.BeginTransaction();
            command.Transaction = tran;
            command.CommandTimeout = 60000;
            return command;
        }
        public static void EndCommand(SqlCommand command)
        {
            if (command.Connection.State == ConnectionState.Open)
            {
                command.Connection.Close();
            }
        }
        public static void SqlCommit(SqlCommand command)
        {
            command.Transaction.Commit();
            if (command.Connection.State == ConnectionState.Open)
            {
                command.Connection.Close();
            }
        }
        public static void SqlRollback(SqlCommand command)
        {
            command.Transaction.Rollback();
            if (command.Connection.State == ConnectionState.Open)
            {
                command.Connection.Close();
            }
        }
    }
}
- 本文标题: 本地正常,放在IIS服务器上面偶尔会出现 列""不属于表Table
- 文章分类:【.NET/Web】
- 非特殊说明,本文版权归【胡同里的砖头】个人博客 所有,转载请注明出处.