Как передавать данные из / в поля BLOB-объектов SQL Server? - PullRequest
7 голосов
/ 20 января 2010

Для фона к этому вопросу, см «Как сериализовать большой граф объекта .NET в SQL Server BLOB без создания большого буфер? », который теперь имеет большой щедрость на него.

Я хочу иметь возможность использовать Stream объект для чтения / записи данных в / из поля BLOB в строке SQL Server без необходимости помещать все данные в временный буфер.


Если вышеперечисленное можно сделать ...

Так как класс Streams имеет множество методов CanXXX(), не все потоки могут использоваться всеми методами, принимающими входные / выходные данные потока.

Итак, насколько способным должен быть поток для работы с ADO.NET при отправке данных в / из SQL Server?


Мне нужен стандартный поток, к которому я могу передать его другим API.

Также два ответа пока касаются только получения данных из SqlServer, а не отправки данных в SqlServer.

Ответы [ 2 ]

5 голосов
/ 20 января 2010

Вот пример для чтения данных кусками:

    using (var conn = new SqlConnection(connectionString))
    using (var cmd = conn.CreateCommand())
    {
        conn.Open();
        cmd.CommandText = "select somebinary from mytable where id = 1";
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                byte[] buffer = new byte[1024]; // Read chunks of 1KB
                long bytesRead = 0;
                long dataIndex = 0;
                while ((bytesRead = reader.GetBytes(0, dataIndex, buffer, 0, buffer.Length)) > 0)
                {
                    byte[] actual = new byte[bytesRead];
                    Array.Copy(buffer, 0, actual, 0, bytesRead);
                    // TODO: Do something here with the actual variable, 
                    // for example write it to a stream
                    dataIndex += bytesRead;
                }
            }

        }
    }
1 голос
/ 20 января 2010

Вы бы не поместили все данные в буфер; Вы обычно запускаете цикл, буферизуя несколько кратных 8040 байтов (связанных с размером страницы), добавляя BLOB каждый раз WRITETEXT / UPDATETEXT для image или UPDATE.WRITE для varbinary(max). Вот более старый пример (используется image, извините).

Аналогичным образом, при считывании данных вы, вероятно, будете перекачивать данные в небольшом буфере в какой-либо другой пункт назначения (HTTP-ответ, сеть, файл и т. Д.). Что-то как это (хотя мне не совсем нравится, как он обрабатывает свои EOF / чанкинг; я бы проверил + ve байтов прочитал).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...