【问题标题】:type used in a using statement must be implicitly convertible to 'System.IDisposable'在 using 语句中使用的类型必须可以隐式转换为“System.IDisposable”
【发布时间】:2017-02-06 21:15:37
【问题描述】:

我的代码中有一个错误列为:“DatabaseLayer”:在 using 语句中使用的类型必须隐式转换为“System.IDispsable”。

我尝试查看 MSDN 和其他 Stack Overflow 问题,但我没有解决该错误。我正在使用带有 .NET Framework 4.5.1 的 Visual Studio 2015。

错误在第 56 行,但我已在错误行上方注释。以下是我文件中的代码:

public class UserDataAccessLayer : IDisposable
{
    public bool Create(string username, string pwd, string email)
    {
        bool retVal = false;
        SqlCommand sqlCmd = new SqlCommand("CreateUser");
        sqlCmd.CommandType = CommandType.StoredProcedure;
        sqlCmd.Parameters.AddWithValue("@Username", username);
        sqlCmd.Parameters.AddWithValue("@Pwd", pwd);
        sqlCmd.Parameters.AddWithValue("@Email", email);
        int result = new DatabaseLayer().ExecuteNonQuery(sqlCmd);
        if (result != Int32.MaxValue)
            retVal = true;

        return retVal;
    }

    public bool Create(string username, string pwd, string email, int roleId)
    {
        bool retVal = false;
        SqlCommand sqlCmd = new SqlCommand("CreateUser");
        sqlCmd.CommandType = CommandType.StoredProcedure;
        sqlCmd.Parameters.AddWithValue("@Username", username);
        sqlCmd.Parameters.AddWithValue("@Pwd", pwd);
        sqlCmd.Parameters.AddWithValue("@Email", email);
        int result = new DatabaseLayer().ExecuteNonQuery(sqlCmd);
        if (result != Int32.MaxValue)
            retVal = true;

        return retVal;
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }

    public User GetUserInfo(string username, string pwd)
    {
        User user = null;
        using (DatabaseLayer dbLayer = new DatabaseLayer())
        {
            SqlCommand sqlCmd = new SqlCommand("GetUserInfo");
            sqlCmd.CommandType = CommandType.StoredProcedure;
            sqlCmd.Parameters.AddWithValue("@Username", username);
            sqlCmd.Parameters.AddWithValue("@Pwd", pwd);
            user = dbLayer.GetEntityList<User>(sqlCmd).FirstOrDefault();
        }
        return user;
    }
}

【问题讨论】:

  • DatabaseLayer 没有实现 IDisposable。所以不要在 using 语句中创建它。
  • 虽然错误很清楚,但帖子中提供的代码不是 - 没有关于 DatabaseLayer 类型的信息。请阅读minimal reproducible example 发布代码指南。
  • stackoverflow.com/questions/21719567/… 中所述,如果您正在使用实体框架但尚未安装包,也会出现警告。

标签: c# stored-procedures


【解决方案1】:

using 块:

using (DatabaseLayer dbLayer = new DatabaseLayer())
{
    //...
}

本质上是这个的语法简写(或者至少是相当接近它的东西):

DatabaseLayer dbLayer = new DatabaseLayer();
try
{
    //...
}
finally
{
    dbLayer.Dispose();
}

注意finally 中的最后一行。如果您的对象没有实现 IDisposable 则无法编译。因此出现错误。

基本上,您有两个选择:

  1. Implement IDisposable on your type,或者...
  2. 不要使用 using 块。

【讨论】:

    【解决方案2】:

    按照 David 的建议,通过取消“using() 和 try 和 finally 块来修复错误。请参阅“public User GetUserInfo(...)”下方的更正代码:

    public User GetUserInfo(string username, string pwd)
    {
        User user = null;
        DatabaseLayer dbLayer = new DatabaseLayer();
    
        try
        {
            SqlCommand sqlCmd = new SqlCommand("GetUserInfo");
            sqlCmd.CommandType = CommandType.StoredProcedure;
            sqlCmd.Parameters.AddWithValue("@Username", username);
            sqlCmd.Parameters.AddWithValue("@Pwd", pwd);
            user = dbLayer.GetEntityList<User>(sqlCmd).FirstOrDefault();
        }
    
        finally
        {
            dbLayer.Dispose();
        }
        return user;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多