@beduin01

Зачем нужен Stream в C#?

Потребовалось мне тут на C# написать крохотное приложение. Задача -- прочитать блоб из одной БД и записать в другую (тоже в блоб).

C# знаю лишь поверхностно. Мне не понятен такой момент. Почему во всех примерах используются какие-то Streams?

byte[] userBlob;

                myCommand.CommandText = "SELECT id, userblob FROM USERS";
                myCommand.Connection = myFBConnection;
                myCommand.Transaction = myTransaction;

                FbDataReader reader = myCommand.ExecuteReader();
                
                try
                {
                    while(reader.Read())
                    {
                        Console.WriteLine(reader.GetString(0));
                        userBlob = // Вот тут что должно быть? Читать как биты или поток

                    }
                }

                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    Console.WriteLine("Can't read data from DB");
                }


БД. FireBird.

Вроде бы мне метод `reader.GetBytes` нужен, так?

Попробовал так:
userBlob = reader.GetBytes(0,0,userBlob,0,userBlob.Length);

Но не могу понять зачем в параметры метода нужно передавать еще раз userBlob если в него читаются данные.
И оно кстати ругается: Cannot convert type long to byte[]

тут еще как я понимаю размерность буфера предполагается указывать -- вопрос, а как узнать то сколько данных будет в самом блобе?
  • Вопрос задан
  • 1048 просмотров
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C#
GetBytes возвращает long, не знаю где вы нашли, что он возвращает массив байт:
https://msdn.microsoft.com/ru-ru/library/system.da...

Так что передача буфера третьим параметром более чем логична.

И оно кстати ругается: Cannot convert type long to byte[]

Да ладно вам?) А это не навело вас... на мысли относительно типа возвращаемого значения?) Вы сами придумали, что он возвращает массив байт?
тут еще как я понимаю размерность буфера предполагается указывать -- вопрос, а как узнать то сколько данных будет в самом блобе?

Ну вот если все таки пройдете в документацию, то ниже вы увидите следующее:
GetBytes возвращает количество доступных байтов в поле.Часто это значение равно точной длине поля.Однако возвращенное число может быть меньше фактической длины поля, если GetBytes уже использовался для получения байтов из поля.

При передаче буфера, значение которого равно null, метод GetBytes возвращает длину строки в байтах.

Поэтому, если вы не знаете длину буфера - вызовите метод с null для получения этой длины, создайте буфер и поместите туда значение вторым вызовом GetBytes.
В .net и C# нормальная документация, ее полезно читать.
Почему во всех примерах используются какие-то Streams?

Потому что BLOB они на то и BLOB, что Large Object. Блоб может быть килобайтовый, а может быть и гигабайтового размера. Гигабайт читать в массив целиком далеко не всегда целесообразно, как правило - вообще не целесообразно.

Стримы - это абстракция в стандартной библиотеке, реализующая концепцию потоковой обработки. Файловый поток не будет загружать 10-гиговый файл в память целиком, если вы прочтете только первый килобайт. С блобами из базы аналогичная ситуация. Даже если конкретно ваш драйвер БД не поддерживает загрузку блоба по частям, в принципе такая практика существует.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MADm
Cудя по всему вы используете Firebird. Я не могу понять какая именно библиотека используется.
Вот тут смотрели? codeproject могу предположить что нужно получать данные вот так userBlob = reader[номер столбца];
Но советую лучше прочитать документацию по конкретной библиотеке что используете, или использовать другую библиотеку для вашей бд.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы