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-гиговый файл в память целиком, если вы прочтете только первый килобайт. С блобами из базы аналогичная ситуация. Даже если конкретно ваш драйвер БД не поддерживает загрузку блоба по частям, в принципе такая практика существует.