首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当SqlDataReader返回太多记录时,创建新的SqlFileStream对象时出错

当SqlDataReader返回太多记录时,创建新的SqlFileStream对象时出错
EN

Stack Overflow用户
提问于 2019-11-06 05:04:22
回答 1查看 26关注 0票数 0

我正在尝试访问SqlServer FILESTREAM表中的几个文件。此代码适用于SqlDataReader返回的文件数量相对较少的情况。大约20个文件。但是,当SqlDataReader返回几百条记录时,我在第一次执行while循环时收到这个错误:“进程无法访问指定的文件,因为它已在另一个事务中打开。”

错误发生在下面这一行:

sfsList.Add(fileNameText, new SqlFileStream(filePath, txContext, FileAccess.Read));

有什么想法吗?

代码段如下:

代码语言:javascript
复制
        int ProjectID;
        int.TryParse(Request.QueryString["ProjectID"], out ProjectID);
        string filePath = null;
        byte[] txContext = null;
        string fileNameText = null;
        Dictionary<string, SqlFileStream> sfsList = new Dictionary<string, SqlFileStream>();

        using (SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ATRD"].ToString()))
        {
            cn.Open();
            using (SqlTransaction trn = cn.BeginTransaction("GetAllDocsTran"))
            {
                SqlCommand cmd = new SqlCommand("GetAllDocs", cn, trn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@ProjectID", ProjectID);

                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    try
                    {
                        while (reader.Read())
                        {
                            txContext = (reader["txContext"] as byte[]);
                            filePath = reader["filePath"].ToString();
                            fileNameText = reader["fileNameText"].ToString();
                            sfsList.Add(fileNameText, new SqlFileStream(filePath, txContext, FileAccess.Read));

                        }
                    }
                    catch (Exception ex)
                    {
                        Response.Write(ex.Message);
                        try
                        {
                            cmd.Transaction.Rollback();
                        }
                        catch (Exception ex2)
                        {
                            Response.Write(ex.Message + ex2.Message);
                        }
                    }
                }
            }
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-10 00:25:02

我首先为我想要的文件选择了所有主键,并将它们添加到一个集合中,从而解决了这个问题。然后,我简单地使用循环逐个检索文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58719442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档