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