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

Transactions 当SqlDataReader返回太多记录时,创建新SqlFileStream对象时出错,transactions,ado.net,filestream,sqldatareader,sqlfilestream,Transactions,Ado.net,Filestream,Sqldatareader,Sqlfilestream,我正在尝试访问SqlServer FILESTREAM表中的几个文件。当SqlDataReader返回的文件数量相对较少时,此代码可以工作。大约20个文件。但是,当SqlDataReader返回几百条记录时,我在第一次通过while循环时收到这个错误:“进程无法访问指定的文件,因为它已在另一个事务中打开。” 错误发生在此行: sfsList.Add(fileNameText,newsqlfilestream(filePath,txContext,FileAccess.Read)) 有什么想法吗

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

错误发生在此行:

sfsList.Add(fileNameText,newsqlfilestream(filePath,txContext,FileAccess.Read))

有什么想法吗

代码段如下:

        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);
                        }
                    }
                }
            }
        }
int投影;
int.TryParse(Request.QueryString[“ProjectID”],out ProjectID);
字符串filePath=null;
字节[]txContext=null;
字符串fileNameText=null;
字典sfsList=新字典();
使用(SqlConnection cn=newsqlconnection(System.Configuration.ConfigurationManager.connectionString[“ATRD”].ToString())
{
cn.Open();
使用(SqlTransaction trn=cn.BeginTransaction(“GetAllDocsTran”))
{
SqlCommand cmd=newsqlcommand(“GetAllDocs”,cn,trn);
cmd.CommandType=CommandType.storedProcess;
cmd.Parameters.AddWithValue(“@ProjectID”,ProjectID);
使用(SqlDataReader=cmd.ExecuteReader())
{
尝试
{
while(reader.Read())
{
txContext=(读卡器[“txContext”]作为字节[]);
filePath=reader[“filePath”].ToString();
fileNameText=reader[“fileNameText”].ToString();
添加(fileNameText,newsqlfilestream(filePath,txContext,FileAccess.Read));
}
}
捕获(例外情况除外)
{
响应。写入(例如消息);
尝试
{
cmd.Transaction.Rollback();
}
捕获(异常ex2)
{
响应.写入(ex.Message+ex2.Message);
}
}
}
}
}

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