0

很长一段时间,我的代码一直在运行,但是最近遇到这个错误,Object reference not set to an instance of an object.不知道是不是和新建数据库的使用有关。

这是我的代码:

con2.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.CommandText = "SELECT QtyInHand FROM Inventory WHERE ProductID=@ProductID";
    cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = productID;
    int existingQty = (int)cmd.ExecuteScalar();
    cmd.Parameters.Clear();
    cmd.CommandText = "UPDATE Inventory SET QtyInHand=@QtyInHand WHERE ProductID=@ProductID";
    cmd.Parameters.Add("@QtyInHand", SqlDbType.Int).Value = existingQty - int.Parse(quantity);
    cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = productID;
    cmd.ExecuteNonQuery();
    con2.Close();

这部分的错误:int existingQty = (int)cmd.ExecuteScalar();

当我尝试使用我的其他 SqlConnection 时:con

con.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.CommandText = "SELECT QtyInHand FROM Inventory WHERE ProductID=@ProductID";
    cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = productID;
    int existingQty = (int)cmd.ExecuteScalar();
    cmd.Parameters.Clear();
    cmd.CommandText = "UPDATE Inventory SET QtyInHand=@QtyInHand WHERE ProductID=@ProductID";
    cmd.Parameters.Add("@QtyInHand", SqlDbType.Int).Value = existingQty - int.Parse(quantity);
    cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = productID;
    cmd.ExecuteNonQuery();
    con.Close();

我遇到另一个错误,部分The connection was not closed. The connection's current state is open.错误con.Open();。我应该如何解决这个问题?

4

1 回答 1

2

对于第一个错误,您的executeScalar()调用返回一个空值。优化您的查询 - 您可以通过直接在数据库中运行查询来检查您的查询 - 或者更改您的逻辑以处理空值。

对于第二个错误,如果调用Open()抛出该错误,那是因为连接对象之前正在使用并且没有正确关闭。重复使用这样的连接通常被认为是不好的做法,因此请考虑在打开连接实例时创建一个新的连接实例。

编辑:我试图在第二段中暗示一些东西,但现在我觉得我必须明确表示:不要忘记处理你在那里打开的连接,因为它可能是你的应用程序的主要性能猪。特别是因为它是一个 ASP.NET。不需要时立即处理连接。当你调用Dispose()一个连接时,它会被关闭——还有其他更精细的内存管理程序的额外好处。一有时间就阅读该using声明及其与连接的用法。

于 2013-08-26T13:31:00.913 回答