收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 3612|回复: 3

[数据库] ASP .NET +SQL SERVER开发 一个 经验之谈

[复制链接]
发表于 2011-6-27 18:22:33 | 显示全部楼层 |阅读模式
ASP .NET错误信息:"/"应用程序中的服务器错误。列"uaddrgt"不属于表Table 的一个原因及解决办法

我们一个客户的代码,经常发生如 ASP .NET错误信息:"/"应用程序中的服务器错误。列"uaddrgt"不属于表Table

这一类的错误,仔细查看代码,发现下面的问题:

下面的代码是负责创建数据库连接,同时打开或者不打开数据库事务(下面的代码是客户的错误代码)。

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();
            }
        }
    }
}
 楼主| 发表于 2011-7-8 13:04:02 | 显示全部楼层
自己来顶下
回复 支持 反对

使用道具 举报

发表于 2011-7-11 11:41:58 | 显示全部楼层
刚开始研究。NET,这个很实用,出现这种错误是不是会引起提供这个网站的服务进程关闭呢?我们有一个站,经常出现莫名其妙的服务进程关闭的情况;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-3 16:12:13 | 显示全部楼层
Sql Server数据库性能有问题?又怕数据丢失?又怕系统停止服务?QQ:69166070
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-9-19 11:51 , Processed in 0.093513 second(s), 8 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表