2011-08-31 14 views
0

所以我使用了这个旧的代码,它为数据库调用运行简单的ExecuteNonQuery命令。我正在使用DbConnection,DbTransaction和其他System.Data.Common命令。这个数据库类的执行查询函数有什么问题吗?

只要我在项目的某些部分使用该函数,似乎会得到很多空引用错误,尽管在其他部分看起来很好。我认为它与手动打开连接或调用它有一些问题有关,但是我想知道函数本身是否原本设计得很差(不应该有办法以它被调用的方式修复任何问题吗?)

我觉得涉及到事务时,这些空引用错误会出现得更多,我认为我得到的错误是空例外“_command = _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()); 
    } 
} 
+0

'_command'定义在哪里?还有哪些地方被访问? – Oded

+0

private DbCommand _command = null; ---这不是呃,除了通过这个GetStoredProcCommand的东西来启动。它可以在QueryDatabase()等其他函数中访问,它可以返回结果而不是像execute()那样执行。 – Dexter

+0

并且您访问了多少个地方?你在代码中的许多地方使用'execute'吗? – Oded

回答

2

您的_command变量似乎是一个字段,并且是这样一个共享成员。

因为这样你的代码是很容易容易出现多线程问题(如果两个函数用不同的存储过程调用这个类,会发生什么?)。

A Command也应该被关闭并妥善处置,这不会在您的代码中发生,并非明确无误。

+0

我认为asp.net和网站通常非常线性的事实,使得它没有多线程,就像PHP没有多线程,除非你使用POSIX函数。让我猜,我错了?那么我应该如何编码来解决这个问题呢?应该命令不是一个私人变量,更多的是使用“使用”的局部变量? – Dexter

+0

@Dexter - 向asp.net添加线程非常容易,因此假设您的代码只能在单个完全隔离的线程上运行,可能会带来麻烦。你用一个'using'语句来敲打头部局部变量。 – Oded

+0

虽然没有解决问题。也许别的东西是空的,比如_conn或_command。其中在数据访问类构造创建中初始化: public DataAccess() { _db = DatabaseFactory.CreateDatabase(); _conn = _db.CreateConnection(); } – Dexter

1

如果您在行_command = _db.GetStoredProcCommand(storedProcedure);中收到空引用异常,那么唯一可以为空的是_db。 storedProcedure只是一个参数,_command可以很好地为空而没有问题。

由于您实际上并没有在代码中做任何事情来确保_db存在且有效,打开等,那么这很可能是问题所在。

+0

这里的问题,当我有if(da.getConnectionState()== ConnectionState.Closed)da.openConnection();在代码的某些领域,它也造成了错误。所以我删除了任何打开的连接,因为有人告诉我手动打开连接是错误的,因为它是自动管理的。它解决了很多问题(还有一些代码留在了这里)。当类初始化时_db被初始化。 _db = DatabaseFactory.CreateDatabase(); – Dexter