ASP .NET错误信息:"/"应用程序中的服务器错误。列"uaddrgt"不属于表Table 的一个原因及解决办法
2010-12-13 10:55
811 查看
我们一个客户的代码,经常发生如 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();
}
}
}
}
这一类的错误,仔细查看代码,发现下面的问题:
下面的代码是负责创建数据库连接,同时打开或者不打开数据库事务(下面的代码是客户的错误代码)。
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();
}
}
}
}
相关文章推荐
- asp.net配置IIS后"服务器应用程序不可用"的解决办法 服务器应用程序不可用 您试图在此Web服务器上访问的Web应用程序当前不可用
- asp.net配置IIS后"服务器应用程序不可用"的解决办法
- 创建ASP.NET程序时候发生错误"HTTP/1.0500ServerError"的一个解决办法
- asp.net配置IIS后"服务器应用程序不可用"的解决办法(详细,可用!)
- asp.net配置IIS后"服务器应用程序不可用"的解决办法 服务器应用程序不可用 您试图在此Web服务器上访问的Web应用程序当前不可用。
- linux下设定动态库路径的命令->error while loading shared libraries: xxx.so.x"错误的原因和解决办法
- Asp.net 自定义控件 => 抛出“未知的服务器标记” 异常 解决办法
- ASP.NET 2.0 "服务器应用程序不可用"错误
- "VS.NET Web服务器运行的不是ASP.NET 1.1 版"的解决办法
- [asp.netMVC]"/"应用程序中的服务器错误
- 调试 ASP.NET 应用程序时出现"无法在 Web 服务器上启动调试"的错误
- ASP.NET ,用RESPON.WRITE("")提示信息后,页面左移的解决办法
- asp.net"服务器应用程序不可用"解决方法
- "VS.NET Web服务器运行的不是ASP.NET 1.1 版"的解决办法
- asp.net提示"操作必须使用一个可更新的查询"的解决办法
- "VS.NET Web服务器运行的不是ASP.NET 1.1 版"的解决办法
- 在 ASP.NET 中虚拟目录指向远程共享时发生"System.Security.SecurityException: 安全性错误"的解决办法
- Asp.net 自定义控件 => 抛出“未知的服务器标记” 异常 解决办法
- 解决XP的IIS "HTTP 500”内部服务器错误--asp和asp.net服务器ISS
- "VS.NET Web服务器运行的不是ASP.NET 1.1 版"的解决办法