Asp.net 这个数据库类';执行查询功能?
所以我使用了这段旧代码,它为数据库调用运行简单的ExecuteNonQuery命令。我正在使用DbConnection、DbTransaction和其他System.Data.Common命令 每当我在项目的某些部分使用该函数时,我似乎会遇到很多空引用错误,尽管在其他部分似乎没有问题。我认为这与手动打开连接或调用连接时出现问题有关,但我想知道函数本身最初是否设计得很糟糕(是否应该有一种方法来修复调用时出现的任何问题?) 我觉得当涉及到事务时,这些空引用错误会更频繁地出现,我认为我得到的错误是以下函数中的空异常:“\u command=\u db.GetStoredProcCommand(storedProcedure);”。但该存储过程确实存在,因此毫无意义Asp.net 这个数据库类';执行查询功能?,asp.net,database,enterprise-library,Asp.net,Database,Enterprise Library,所以我使用了这段旧代码,它为数据库调用运行简单的ExecuteNonQuery命令。我正在使用DbConnection、DbTransaction和其他System.Data.Common命令 每当我在项目的某些部分使用该函数时,我似乎会遇到很多空引用错误,尽管在其他部分似乎没有问题。我认为这与手动打开连接或调用连接时出现问题有关,但我想知道函数本身最初是否设计得很糟糕(是否应该有一种方法来修复调用时出现的任何问题?) 我觉得当涉及到事务时,这些空引用错误会更频繁地出现,我认为我得到的错误是以下
public List<OutputParameter> execute(String storedProcedure, StoredProcedureParameter[] sqlParameters)
{
try
{
List<OutputParameter> outputParameters = new List<OutputParameter>();
_command = _db.GetStoredProcCommand(storedProcedure);
for (int x = 0; x < sqlParameters.GetLength(0); x++)
{
if (sqlParameters[x] != null)
{
StoredProcedureParameter sqlParameter = sqlParameters[x];
String param = sqlParameter.ParameterName;
DbType dbType = sqlParameter.DbType;
object value = sqlParameter.Value;
if (sqlParameter.IsOutputParam)
{
_db.AddOutParameter(_command, param, dbType, 32);
OutputParameter outputParameter = new OutputParameter(param);
outputParameters.Add(outputParameter);
}
else
_db.AddInParameter(_command, param, dbType, value);
}
}
if (_transaction == null)
_db.ExecuteNonQuery(_command);
else
_db.ExecuteNonQuery(_command, _transaction);
foreach (OutputParameter op in outputParameters)
{
op.ParameterValue = _db.GetParameterValue(_command, op.ParameterName);
}
return outputParameters;
}
catch (SqlException sqle)
{
throw new DataAccessException(sqle.ToString());
}
catch (Exception e)
{
throw new DataAccessException(e.ToString());
}
}
public List execute(字符串storedProcedure,StoredProcedureParameter[]sqlParameters)
{
尝试
{
List outputParameters=新列表();
_command=\u db.GetStoredProcCommand(storedProcedure);
对于(int x=0;x
您的\u命令
变量似乎是一个字段,因此是一个共享成员
因此,您的代码很容易受到多线程问题的影响(如果两个函数使用不同的存储过程调用该类,会发生什么情况?)
命令
也应正确关闭和处置,这不会发生在您的代码中,也不会以任何方式显式执行。您的\u命令
变量似乎是一个字段,因此是一个共享成员
因此,您的代码很容易受到多线程问题的影响(如果两个函数使用不同的存储过程调用该类,会发生什么情况?)
命令
也应正确关闭和处置,这不会在代码中发生,也不会以任何方式显式发生。如果在\u Command=\u db.GetStoredProcCommand(storedProcedure)行中出现空引用异常
那么唯一可以为空的就是\u db
。storedProcedure只是一个参数,而且_命令可以很高兴地为null,而不会出现任何问题
由于您实际上没有在代码中执行任何操作来确保_db存在且有效、打开等,因此这很可能就是问题所在。如果您在
\u命令=_db.GetStoredProcCommand(storedProcedure)
那么唯一可以为空的就是\u db
。storedProcedure只是一个参数,而且_命令可以很高兴地为null,而不会出现任何问题
由于您实际上没有在代码中执行任何操作以确保_db存在且有效、打开等,因此这很可能就是问题所在。哪里定义了
\u命令
?还可以在哪里访问它?private DbCommand\u command=null;--它不是,呃,通过这个GetStoredProcCommand启动的。它是在其他函数中访问的,比如QueryDatabase(),它会返回结果,而不是像execute()那样执行。您在多少地方访问它?您是否在代码的许多地方使用了execute
?是的,在许多地方一个接一个地重复使用。这就是遗留代码的设计方式。我不得不删除很多这样的代码:if(da.getConnectionState()==ConnectionState.Closed)da.openConnection();------因为它导致了一些类型的崩溃,并且由于空引用而停止了整个网站的执行?还可以在哪里访问它?private DbCommand\u command=null;--它不是,呃,通过这个GetStoredProcCommand启动的。它是在其他函数中访问的,比如QueryDatabase(),它会返回结果,而不是像execute()那样执行。您在多少地方访问它?您是否在代码的许多地方使用了execute
?是的,在许多地方一个接一个地重复使用。这就是遗留代码的设计方式。我不得不删除很多这样的代码:if(da.getConnectionState()==ConnectionState.Closed)da.openConnection();------因为它导致了一些崩溃,并由于空引用而停止了整个网站的执行。我认为asp.net和网站通常都是线性的,这使得没有什么是多线程的,比如PHP没有多线程,除非使用POSIX函数。让我猜猜,我错了?那么我应该如何编写代码来解决这个问题呢?命令不应该是私有变量,更应该是使用“using”的局部变量?@Dexter-将线程添加到asp.net非常容易,因此假设您的代码只在单个完全隔离的线程上运行可能会带来麻烦。你用using
语句击中了head-local变量的要害。你没有解决这个问题