Сохранить файл XLSM в столбце базы данных и получить? - PullRequest
0 голосов
/ 09 июня 2009

Код, ранее реализованный в файле xls, сохраняет его в столбце таблицы, используя поток, который я использую тем же методом, но единственное изменение заключается в том, что сохраненный файл представляет собой файл типа xlsm или xlsx, который он сохраняет в столбец в базе данных

Когда я пытаюсь получить содержимое из базы данных и выбрасываю сохраненный файл xlsm или xlsx, я получаю сообщение об ошибке «Файл Excel обнаружил нечитаемый контент, вы хотите восстановить содержимое этой рабочей книги?»

Вот код для сохранения файла xlsm или xlsx

System.IO.Stream filestream = System.IO.File.Open(file, System.IO.FileMode.Open);
int fileLength = (int)filestream.Length;
byte[] input = new byte[fileLength];
filestream.Read(input, 0, fileLength);
string Sql = "insert into upload values(@contents)";
con.Open();
System.Data.SqlClient.SqlCommand c = new System.Data.SqlClient.SqlCommand(Sql, con);
c.Parameters.Add("@contents", System.Data.SqlDbType.Binary);
c.Parameters["@contents"].Value = input;
c.ExecuteNonQuery();

Для получения и отправки пользователю

SqlCommand comm = new SqlCommand("select contents from upload order by id desc", con);
SqlDataReader reader = comm.ExecuteReader();
int bufferSize = 32768;                   
        byte[] outbyte = new byte[bufferSize];  
        long retval;                           
        long startIndex = 0;                    
        startIndex = 0;
        retval = reader.GetBytes(0, startIndex, outbyte, 0, bufferSize);
        while (retval > 0)
        {
            System.Web.HttpContext.Current.Response.BinaryWrite(outbyte);
            startIndex += bufferSize;
            if (retval == bufferSize)
            {
                retval = reader.GetBytes(2, startIndex, outbyte, 0, bufferSize);
            }
            else
            {
                retval = 0;
            }
        }

Ответы [ 2 ]

0 голосов
/ 17 июля 2009

Я не мог не заметить количество мест, где вашему коду не удалось обернуть IDisposable в блок using, например:

using (SqlConnection con = new SqlConnection(connectionString))
{
    byte[] input;
    using (System.IO.Stream filestream = System.IO.File.Open(file, System.IO.FileMode.Open))
    {
        int fileLength = (int)filestream.Length;
        input = new byte[fileLength];
        filestream.Read(input, 0, fileLength);
    }
    const string Sql = "insert into upload values(@contents)";
    con.Open();
    using (System.Data.SqlClient.SqlCommand c = new System.Data.SqlClient.SqlCommand(Sql, con))
    {
        c.Parameters.Add("@contents", System.Data.SqlDbType.Binary);
        c.Parameters["@contents"].Value = input;
        c.ExecuteNonQuery();
    }

    using (SqlCommand comm = new SqlCommand("select contents from upload order by id desc", con))
    {
        using (SqlDataReader reader = comm.ExecuteReader())
        {
            int bufferSize = 32768;
            byte[] outbyte = new byte[bufferSize];
            long retval;
            long startIndex = 0;
            startIndex = 0;
            retval = reader.GetBytes(0, startIndex, outbyte, 0, bufferSize);
            while (retval > 0)
            {
                System.Web.HttpContext.Current.Response.BinaryWrite(outbyte);
                startIndex += bufferSize;
                if (retval == bufferSize)
                {
                    retval = reader.GetBytes(2, startIndex, outbyte, 0, bufferSize);
                }
                else
                {
                    retval = 0;
                }
            }
        }
    }
}
0 голосов
/ 09 июня 2009

Пара вещей поражает меня как возможности.

Во-первых, вы не звоните reader.Read().

Во-вторых, нет необходимости в проверке retval == bufferSize - просто вызовите GetBytes еще раз, и он вернет 0, если из поля не было прочитано ни одного байта.

В-третьих, когда вы пишете в HttpResponse, вам необходимо убедиться, что вы вызываете Response.Clear () перед записью байтов в вывод, и Response.End () после записи файла в ответ.

Другая вещь, которую нужно попробовать, это сохранить файл на жесткий диск и сравнить его с оригиналом. Это тот же размер? Если он больше, значит, вы пишете слишком много информации в файл (см. Предыдущие комментарии о HttpResponse). Если оно меньше, значит, вы пишете недостаточно и, скорее всего, выходите из цикла слишком рано (см. Комментарий о retval).

...