Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 这个数据库类';执行查询功能?_Asp.net_Database_Enterprise Library - Fatal编程技术网

Asp.net 这个数据库类';执行查询功能?

Asp.net 这个数据库类';执行查询功能?,asp.net,database,enterprise-library,Asp.net,Database,Enterprise Library,所以我使用了这段旧代码,它为数据库调用运行简单的ExecuteNonQuery命令。我正在使用DbConnection、DbTransaction和其他System.Data.Common命令 每当我在项目的某些部分使用该函数时,我似乎会遇到很多空引用错误,尽管在其他部分似乎没有问题。我认为这与手动打开连接或调用连接时出现问题有关,但我想知道函数本身最初是否设计得很糟糕(是否应该有一种方法来修复调用时出现的任何问题?) 我觉得当涉及到事务时,这些空引用错误会更频繁地出现,我认为我得到的错误是以下

所以我使用了这段旧代码,它为数据库调用运行简单的ExecuteNonQuery命令。我正在使用DbConnection、DbTransaction和其他System.Data.Common命令

每当我在项目的某些部分使用该函数时,我似乎会遇到很多空引用错误,尽管在其他部分似乎没有问题。我认为这与手动打开连接或调用连接时出现问题有关,但我想知道函数本身最初是否设计得很糟糕(是否应该有一种方法来修复调用时出现的任何问题?)

我觉得当涉及到事务时,这些空引用错误会更频繁地出现,我认为我得到的错误是以下函数中的空异常:“\u command=\u db.GetStoredProcCommand(storedProcedure);”。但该存储过程确实存在,因此毫无意义

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变量的要害。你没有解决这个问题