Ошибка при создании нового объекта SqlFileStream, когда SqlDataReader возвращает слишком много записей - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь получить доступ к нескольким файлам в таблице SqlServer FILESTREAM. Этот код работает, когда число файлов, возвращаемых SqlDataReader, относительно мало. Около 20 файлов. Однако, когда SqlDataReader возвращает несколько сотен записей, я впервые получаю эту ошибку, проходя цикл while: «Процесс не может получить доступ к указанному файлу, так как он был открыт в другой транзакции».

Ошибка происходит в этой строке:

sfsList.Add(fileNameText, new SqlFileStream(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);
                        }
                    }
                }
            }
        }
...