是不是没有未关闭连接的正确方法?

时间:2016-03-14 22:41:32

标签: c# sql asp.net tsql

我正在尝试调试

的来源
  

异常: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对吗?嵌套错了什么?

1 个答案:

答案 0 :(得分:1)

您收到的错误不是因为无效的连接处理。通过使用using(){}作用域,您可以很好地实现它,因为连接将在离开作用域时自动处理。但是,GetAllVersions不是一个有效的操作,要么是因为程序逻辑有问题,要么是因为它不存在,这就是错误的原因。

如果你实际上有一个以这种方式命名的存储过程(这不是一个好习惯),你应该在exec之前加上它,比如:

exec GetAllVersions

但是,您应该将其重命名为遵循通用准则:     exec usp_GetAllVersions

或类似内容,请参阅https://www.mssqltips.com/sqlservertutorial/169/naming-conventions-for-sql-server-stored-procedures/以获取有关良好命名的示例。

编辑1: 我建议您将存储过程与问题一起发布,或者检查存储过程是否可以在用户会话中运行。我的钱不是。