Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 09.05.2015
Сообщений: 7
1

SqlFileStream - функции был передан недопустимый параметр

24.03.2020, 12:07. Показов 770. Ответов 2

Author24 — интернет-сервис помощи студентам
Разрабатываю приложение с использованием FILESTREAM на MSSQL 2017.
При создании базы данных включил возможность использования FILESTREAM, создал таблицу по правилам.
Сервер использую локальный.
Запускаю Managment Studio, выполняю следующий скрипт и он работает прекрасно
SQL
1
2
3
INSERT INTO Files(Id, SIZE, FileName, Description, DATA)
SELECT NEWID(), 1254, '1.zip', 'description', BulkColumn
FROM OPENROWSET(BULK 'C:/temp/1.zip', SINGLE_BLOB) AS f;
Пытаюсь напись в приложении следующий код, но вылетает ошибка "функции был передан недопустимый параметр"
Пытаюсь записать тот же файл.
Ошибка вылетает в строке создания var dest = new SqlFileStream(server_path, server_context, FileAccess.Write)
При отладке путь - есть, контекст - 16 байт.
Всё лежит внутри одной транзакции.
Не могу разобраться, в чём может быть проблема...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 
    public Guid add(string file, string description)
    {
            var file_info = new FileInfo(file);
            var entity = new File
            {
                Id = Guid.NewGuid(),
                Description = description,
                FileName = file_info.Name,
                Size = file_info.Length,
            };
 
            _upload(file, entity);
            return entity.Id;
    }
 
    private void _upload(string file, File entity)
        {
            using (TransactionScope ts = new TransactionScope())
            {
                string server_path;
                byte[] server_context;
 
                using (SqlConnection connection = new SqlConnection(MyDbContext.Conn.String()))
                {
                    string sql = @"INSERT INTO Files(Id, Size, FileName, Description) VALUES(@Id, @Size, @FileName, @Description); " +
                        "SELECT Data.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM Files WHERE Id = @Id;";
                    using (SqlCommand command = new SqlCommand(sql, connection))
                    {
                        command.Parameters.Add("@Id", SqlDbType.UniqueIdentifier).Value = entity.Id;
                        command.Parameters.Add("@Size", SqlDbType.BigInt).Value = entity.Size;
                        command.Parameters.Add("@FileName", SqlDbType.NVarChar).Value = entity.FileName;
                        command.Parameters.Add("@Description", SqlDbType.NVarChar).Value = entity.Description;
                        connection.Open();
                        using (SqlDataReader reader = command.ExecuteReader())
                        {
                            reader.Read();
                            server_path = reader.GetSqlString(0).Value;
                            server_context = reader.GetSqlBinary(1).Value;
                            reader.Close();
                        }
                    }
 
                    const int BlockSize = 1024 * 4;
 
                    using (var source = new FileStream(file, FileMode.Open, FileAccess.Read))
                    {
                        using (var dest = new SqlFileStream(server_path, server_context, FileAccess.Write))
                        {
                            byte[] buffer = new byte[BlockSize];
                            int bytesRead;
                            while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                dest.Write(buffer, 0, bytesRead);
                                dest.Flush();
                            }
                            dest.Close();
                        }
                        source.Close();
                    }
                }
                ts.Complete();
            }
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.03.2020, 12:07
Ответы с готовыми решениями:

Необработанное исключение по адресу 0x0FFCE906. Недопустимый параметр был передан функции
В Binar.cpp появляется необработанное исключение. Подскажите, как это исправить, пожалуйста. ...

Недопустимый параметр был передан функции, для которой недопустимые параметры вызывают неустранимую ошибку
Необработанное исключение по адресу 0x0F47F2F6 (ucrtbased.dll) в Dist_2.exe: Недопустимый параметр...

Winapi ошибка "недопустимый параметр был передан функции"
Добрый день. Пишу программу в WinApi, которая анализирует и предоставляет данные сенсора в окошке...

Ошибка "Недопустимый параметр был передан функции"
Написал программу, которая должно в заданном месте в текстовом файле вставить подстроку, при ...

2
HF
1192 / 784 / 185
Регистрация: 09.09.2011
Сообщений: 2,392
Записей в блоге: 2
25.03.2020, 14:47 2
Честно сказать не понятно что вы творите во второй части.
1) зачем открывается FileStream?
C#
1
using (var source = new FileStream(file, FileMode.Open, FileAccess.Read))
Сам SqlFileStream и есть Stream. Из него читают и пишут.

2) Не понятно что тут вы решили делать
C#
1
using (var dest = new SqlFileStream(server_path, server_context, FileAccess.Write))
Вроде бы вы прочитали из БД файл. Сейчас бы его читать, но нет, вы прямо в прочтённые данные пишите какие-то другие данные. Если вы хотели файл изменить, то зачем сложности с Insert или со чтением какого-то файла?
Вот самый простой пример видимо по работе с этой функцией: читать.
0
1 / 1 / 0
Регистрация: 09.05.2015
Сообщений: 7
04.08.2020, 21:04  [ТС] 3
Как оказалось, проблема была не в коде. Просто надо было настроить в Security в базе данных доступ пользователям. После добавления нужных пользователей, всё заработало как часы.

Правда, до сих пор не знаю как удалить файлы. После удаления записи, они всё равно остаются на диске, хоть в таблице их нет...
0
04.08.2020, 21:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.08.2020, 21:04
Помогаю со студенческими работами здесь

Ошибка "Недопустимый параметр был передан функции"
Необработанное исключение по адресу 0x7947F2F6 (ucrtbased.dll) в source.exe: Недопустимый параметр...

Ошибка в проекте OpenCV: "Недопустимый параметр был передан функции"
Всем, привет. Помогите решить проблему при запуске проекта OpenCV. У меня возникает ошибка при...

Необработанное исключение по адресу 0x576CF2F6 (ucrtbased.dll) в Курсовая 4.exe: Недопустимый параметр был передан функц
Добрый день, умоляю помогите, я вообще не понимаю почему не работает. Весь код скопировал с примера...

Может определить, был ли передан параметр, если нет, то присвоить значение 'по умолчанию'?
Я новичок в php, только осваиваю. Такой вот вопрос: Мой скрипт обрабатывает переменную, которая...

Метод изменяет исходные данные в масстве, который был передан как аргумент
Почему метод изменяет исходные данные в масстве, который был передан как аргумент? List<Point>...

По заданию нужно чтобы первый параметр функции был массивом. Как сделать?
Добрый день. Я только начал учить основы JS. По заданию мне нужно что бы первый параметр функции...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru