C# using语句中使用的类型必须隐式转换为';System.IDisposable';

C# using语句中使用的类型必须隐式转换为';System.IDisposable';,c#,stored-procedures,C#,Stored Procedures,我的代码中有一个错误列为:“DatabaseLayer”:using语句中使用的类型必须隐式转换为“System.IDispTable” 我试图查看MSDN和其他堆栈溢出问题,但我没有解决错误。我正在使用Visual Studio 2015和.NET Framework 4.5.1 错误在第56行,但我已经在上面的错误行中进行了注释。以下是我文件中的代码: public class UserDataAccessLayer : IDisposable { public bool Creat

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

我试图查看MSDN和其他堆栈溢出问题,但我没有解决错误。我正在使用Visual Studio 2015和.NET Framework 4.5.1

错误在第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;
    }
}
公共类UserDataAccessLayer:IDisposable { 公共bool创建(字符串用户名、字符串密码、字符串电子邮件) { bool-retVal=false; SqlCommand sqlCmd=新的SqlCommand(“CreateUser”); sqlCmd.CommandType=CommandType.StoredProcess; sqlCmd.Parameters.AddWithValue(“@Username”,Username); sqlCmd.Parameters.AddWithValue(“@Pwd”,Pwd); sqlCmd.Parameters.AddWithValue(“@Email”,Email); int result=new DatabaseLayer().ExecuteNonQuery(sqlCmd); 如果(结果!=Int32.MaxValue) retVal=true; 返回返回; } 公共bool创建(字符串用户名、字符串密码、字符串电子邮件、int roleId) { bool-retVal=false; SqlCommand sqlCmd=新的SqlCommand(“CreateUser”); sqlCmd.CommandType=CommandType.StoredProcess; sqlCmd.Parameters.AddWithValue(“@Username”,Username); sqlCmd.Parameters.AddWithValue(“@Pwd”,Pwd); sqlCmd.Parameters.AddWithValue(“@Email”,Email); int result=new DatabaseLayer().ExecuteNonQuery(sqlCmd); 如果(结果!=Int32.MaxValue) retVal=true; 返回返回; } 公共空间处置() { 抛出新的NotImplementedException(); } 公共用户GetUserInfo(字符串用户名、字符串密码) { User=null; 使用(DatabaseLayer dbLayer=newdatabaselayer()) { SqlCommand sqlCmd=newsqlcommand(“GetUserInfo”); sqlCmd.CommandType=CommandType.StoredProcess; sqlCmd.Parameters.AddWithValue(“@Username”,Username); sqlCmd.Parameters.AddWithValue(“@Pwd”,Pwd); user=dbLayer.GetEntityList(sqlCmd.FirstOrDefault(); } 返回用户; } }
A
使用
块:

using (DatabaseLayer dbLayer = new DatabaseLayer())
{
    //...
}
基本上是这方面的语法速记(或者至少是与之相当接近的):

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

基本上,您有两种选择:

  • ,或
  • 不要使用
    使用

  • 遵循David的建议,通过取消“using()和try and finally”块来修复错误。请参阅下面的更正代码“public User GetUserInfo(…)”:

    公共用户GetUserInfo(字符串用户名,字符串pwd) { User=null; DatabaseLayer dbLayer=新的DatabaseLayer(); 尝试 { SqlCommand sqlCmd=newsqlcommand(“GetUserInfo”); sqlCmd.CommandType=CommandType.StoredProcess; sqlCmd.Parameters.AddWithValue(“@Username”,Username); sqlCmd.Parameters.AddWithValue(“@Pwd”,Pwd); user=dbLayer.GetEntityList(sqlCmd.FirstOrDefault(); } 最后 { dbLayer.Dispose(); } 返回用户; }
    DatabaseLayer未实现IDisposable。因此,不要在using语句中创建它。虽然错误非常清楚,但post中提供的代码不是-没有关于
    DatabaseLayer
    类型的信息。请阅读关于发布代码的指南。如警告中所述,如果您使用的是实体框架,但还没有安装软件包。
    DatabaseLayer dbLayer = new DatabaseLayer();
    try
    {
        //...
    }
    finally
    {
        dbLayer.Dispose();
    }
    
    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;
    }