我正在尝试调试
的来源异常:System.InvalidOperationException
消息:内部.Net Framework数据提供程序错误1。
StackTrace:at System.Data.ProviderBase.DbConnectionInternal.PrePush(对象 expectOwner)at System.Data.ProviderBase.DbConnectionPool.PutObject(DbConnectionInternal obj,Object owningObject)at System.Data.ProviderBase.DbConnectionInternal.CloseConnection(的DbConnection owningObject,DbConnectionFactory connectionFactory)at System.Data.SqlClient.SqlConnection.CloseInnerConnection()at System.Data.SqlClient.SqlConnection.Close()at System.Data.SqlClient.SqlConnection.Dispose(布尔处理)at System.ComponentModel.Component.Dispose()
我在日志文件中看到的错误以及我认为导致502错误的错误。我与数据库的所有互动(我试图以最老式的方式尝试这样做)就像
public List<VersionInfo> GetAllVersions ( )
{
List<VersionInfo> Versions = new List<VersionInfo>();
using (SqlConnection con = new SqlConnection(SurveyDbModel._conn))
{
con.Open();
using (SqlCommand cmd = new SqlCommand("GetAllVersions",con))
{
cmd.CommandType = CommandType.StoredProcedure;
using (SqlDataReader dataReader = cmd.ExecuteReader())
{
while (dataReader.Read())
{
Versions.Add(new VersionInfo
{
Id = !dataReader.IsDBNull(0) ? dataReader.GetInt32(0) : default(int),
Title = !dataReader.IsDBNull(1) ? dataReader.GetString(1) : String.Empty
});
}
}
}
con.Close();
}
return Versions;
}
我正在做using
对吗?嵌套错了什么?
答案 0 :(得分:1)
您收到的错误不是因为无效的连接处理。通过使用using(){}作用域,您可以很好地实现它,因为连接将在离开作用域时自动处理。但是,GetAllVersions不是一个有效的操作,要么是因为程序逻辑有问题,要么是因为它不存在,这就是错误的原因。
如果你实际上有一个以这种方式命名的存储过程(这不是一个好习惯),你应该在exec之前加上它,比如:
exec GetAllVersions
但是,您应该将其重命名为遵循通用准则: exec usp_GetAllVersions
或类似内容,请参阅https://www.mssqltips.com/sqlservertutorial/169/naming-conventions-for-sql-server-stored-procedures/以获取有关良好命名的示例。
编辑1: 我建议您将存储过程与问题一起发布,或者检查存储过程是否可以在用户会话中运行。我的钱不是。