2017-02-06 7 views
-1

Ich habe einen Fehler in meinem Code wie folgt aufgelistet: 'DatabaseLayer': in einer using-Anweisung verwendete Typ muss implizit in 'System.IDispable' konvertiert werden.type in einer using-Anweisung verwendet werden muss implizit in 'System.IDisposable' konvertiert werden

Ich habe versucht, MSDN und andere Stack Overflow-Fragen zu betrachten, aber ich habe den Fehler nicht behoben. Ich verwende Visual Studio 2015 mit .NET Framework 4.5.1.

Der Fehler ist in Zeile 56, aber ich habe über die Zeile mit Fehler kommentiert. Unten ist der Code in meiner Datei:

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 implementiert IDisposable nicht, also erstellen Sie es nicht innerhalb einer using-Anweisung – Will

+3

Während der Fehler ziemlich klar ist, ist der Code in der Post nicht - es gibt keine Informationen darüber, was "DatabaseLayer" Typ ist. Bitte lesen [MCVE] Anleitung zum Buchungscode. –

Antwort

5

A using Block:

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

ist im Wesentlichen syntaktische Abkürzung für diesen (oder zumindest etwas einigermaßen nahe daran):

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

Beachten Sie die letzte Zeile in der finally. Wenn Ihr Objekt IDisposable nicht implementiert, dann kann das nicht kompilieren. Daher der Fehler.

Im Wesentlichen gibt es zwei Möglichkeiten:

  1. Implement IDisposable on your type oder ...
  2. Sie kein using Block verwenden.
0

Gefolgt David Rat, den Fehler zu beheben, indem Sie die Einnahme aus öffentlichen Benutzer GetUserInfo (...) "„() verwenden und die try und schließlich Blöcke korrigierten Code Siehe unten.":

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