为什么我们需要创建、打开和关闭数据库连接来检索多个结果集,但如果检索一个结果集则不需要?

Why do we need to create, open and close db connections to retrieve multiple result sets but not if retrieving one set?

为了检索存储过程返回的不同结果集,我们必须使用:

                    UsersPhonesDBContext.Database.Initialize(force: false);
                    DbConnection con = UsersPhonesDBContext.Database.Connection;    

                    var cmd = con.CreateCommand();
                    cmd.CommandText = "[dbo].[SelectPhones]";

                    con.Open();

                    var reader = cmd.ExecuteReader();

                    Phones phones = ((IObjectContextAdapter)UsersPhonesDBContext)
                        .ObjectContext
                        .Translate<Phones>(reader, "Phones", MergeOption.AppendOnly).First();

                    reader.NextResult();

                    Users users = ((IObjectContextAdapter)UsersPhonesDBContext)
                       .ObjectContext
                       .Translate<Users>(reader, "Users", MergeOption.AppendOnly).First();

但是如果过程返回单个结果集,那么我们可以简单地使用

var phones1 = UsersPhonesDBContext.Database.SqlQuery<Phones>("dbo.InsertPhones @model", sqlParam);

无需创建、打开和关闭数据库连接等

所以我的问题是,为什么我们必须创建并打开连接,如果是多组而不是单组,因为两者都是从数据库访问的。

打开和关闭数据库连接在时间和资源方面都是昂贵的操作。同时,如果连接长时间保持打开状态,可能会导致内存泄漏或安全风险。

所以推荐的做法是只在需要的时候打开数据库连接,达到打开的目的就关闭。

在您分享的示例中,一次发生了多个数据库操作。因此,不是为每个操作单独打开连接,而是只打开一个连接,并在操作完成后关闭。这里连接是手动打开和关闭的。

数据访问层的新方法,例如 EntityFramework 等,在内部完成这项工作。

UsersPhonesDBContext.Database.SqlQuery<Phones>("dbo.InsertPhones @model", sqlParam);

在这行代码中,与数据库的连接是在内部打开和关闭的,我们不用担心。

所以主要的动机是尽量减少连接的打开和关闭操作,一旦打开的目的结束就关闭连接。