хранение файлов PDF с использованием файлового потока в файловой системе - PullRequest
1 голос
/ 16 декабря 2011

Я впервые пытаюсь использовать файловый поток для хранения файлов pdf в файловой системе, используя тип столбца varbinary (MAX).

Я выполнил следующие шаги.

  1. включенная функция файлового потока на SQL Server 2008 R2.
  2. Создание файловой группы для хранения BLOB
  3. созданная таблица со столбцом BLOB типа varbinary (max)

Теперь я хочу использовать элемент управления загрузкой файлов, чтобы выбрать файл, и при нажатии на кнопку загрузки он должен сохранить файл PDF. Кроме того, как получить файл?


Я пробовал следующий код

protected void btnFSupload_Click(object sender, EventArgs e)
    {
        SqlConnection cn = null;
        SqlTransaction tx = null;
        SqlCommand cmd = null;
        SqlCommand cmd2 = null;
        bool bCommit = false;

        try
        {
            // read in the file to be saved as a blob in the database
            FileStream input = new FileStream(@"D:\swami.pdf", FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[(int)input.Length];

            input.Read(buffer, 0, buffer.Length);

            cn = new SqlConnection("server=at-hetal01\\sqlexpress;Initial Catalog=practice;Integrated Security=true;");
            cn.Open();

            tx = cn.BeginTransaction();

            cmd = new SqlCommand("dbo.stp_AddBLOB", cn, tx);

            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            SqlDataReader r = cmd.ExecuteReader(System.Data.CommandBehavior.SingleRow);

            r.Read();

            string id = r[0].ToString();
            string path = r[1].ToString();
            r.Close();  

            // get the transaction context
            cmd2 = new SqlCommand("SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()", cn, tx);
            Object obj = cmd2.ExecuteScalar();
            byte[] txCtx = (byte[])obj;

            // open the filestream to the blob
            SafeFileHandle handle = OpenSqlFilestream(path,DESIRED_ACCESS_WRITE,SQL_FILESTREAM_OPEN_NO_FLAGS,txCtx,(UInt32)txCtx.Length,0);

            // open a Filestream to write the blob
            FileStream output = new FileStream(handle,FileAccess.Write,buffer.Length,false);
            output.Write(buffer,0,buffer.Length);
            output.Close();

            if (handle != null && !handle.IsClosed)
                handle.Close();

            bCommit = true;
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
        finally
        {
            if (cn != null)
            {
                switch (bCommit)
                {
                    case true:
                        tx.Commit();
                        break;

                    case false:
                        tx.Rollback();
                        break;
                }

                cn.Close();
            }
        }

    }

Код выше показывает ошибку, как показано ниже

Операционная система возвратила ошибку «0xc000003a ({Путь не найден}. Путь% hs не существует.)» При попытке «NtCreateFile» для «D: \ DB \ FS \ d11132f8-c2a8-452d-ae0c-208164a550d7 \ beb8e1f1-8116-440b-870B-7cef4281a15d \ 0000001c-000000e4-010d. Заявление было прекращено.

Итак, есть какие-нибудь подсказки по этому поводу?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2012

Я знаю, что это старый, но для дальнейшего использования:

Мы проверили значения SERVERPROPERTY, которые предложил @BMP. Они были настроены правильно, так что это не помогло.

Тем не менее, мы пошли дальше и отключили часть общего доступа к файлам Windows для потокового доступа. Как только это было сделано, ошибка исчезла.

В нашем случае это было веб-приложение, работающее на той же машине, что и сервер sql, которое показывало проблему. Я не уверен, что у пользователя пула приложений веб-приложения не было доступа к общей папке, созданной Windows, или нет.

Детали были:

Windows 2003 Server (x86)
IIS 6
SQL Server 2008 R2 Express


ОБНОВЛЕНИЕ: Очевидно, это работало в течение нескольких дней. Он больше не работает.

0 голосов
/ 14 января 2012

Если вы изменили свою таблицу с помощью конструктора таблиц SSMS, атрибут столбца FILESTEAM будет потерян, что приведет к не найденному пути.Убедитесь, что атрибут FILESTREAM установлен для поля файла, выполнив следующую инструкцию в вашей базе данных:

select SERVERPROPERTY('FilestreamShareName') as ShareName,
       SERVERPROPERTY('FilestreamConfiguredLevel') as ConfiguredLevel,
       SERVERPROPERTY('FilestreamEffectiveLevel') as EffectiveLevel

Вам нужно будет изменить таблицу с помощью сценария, а НЕ SSMS, чтобы связать ваш varchar (max)/ filestream поле для FileGroup, которое вы уже должны были создать.

Когда я столкнулся с этой проблемой, я нашел ответ в StackOverflow, но не могу найти его снова для справки.

...