2017-02-06 1 views
-1

J'ai une erreur dans mon code répertorié comme: 'DatabaseLayer': le type utilisé dans une instruction using doit être implicitement convertible en 'System.IDispsable'.le type utilisé dans une instruction using doit être implicitement convertible en 'System.IDisposable'

J'ai essayé d'examiner MSDN et d'autres questions de débordement de pile, mais je n'ai pas résolu l'erreur. J'utilise Visual Studio 2015 avec .NET Framework 4.5.1.

L'erreur est dans la ligne 56, mais j'ai commenté au-dessus de la ligne avec erreur. Voici le code dans mon fichier:

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; 
    } 
} 
+4

DatabaseLayer – Will

+3

Bien que l'erreur soit claire, le code fourni dans la publication n'est pas - il n'y a pas d'information sur le type 'DatabaseLayer'. des conseils sur le code d'affichage. –

Répondre

5

A using Bloc:

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

est essentiellement un raccourci syntaxique pour cela (ou au moins quelque chose raisonnablement proche):

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

Notez cette dernière ligne dans le finally. Si votre objet n'implémente pas IDisposable alors cela ne peut pas compiler. D'où l'erreur.

Essentiellement, vous avez deux options:

  1. Implement IDisposable on your type, ou ...
  2. Ne pas utiliser un bloc using.
0

suivi les conseils de David pour corriger l'erreur en enlevant l'utilisateur GetUserInfo publique (...) " « en utilisant() et try et enfin blocs Voir code corrigé ci-dessous.":

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; 
}