Как сохранить файл в базе данных? - PullRequest
0 голосов
/ 15 марта 2010

Как сохранить загруженный пользователем файл в базу данных? Я хочу сохранить файл в базе данных, как мы можем это сделать? В конце я использую sql с приложением c # .net.

Ответы [ 5 ]

4 голосов
/ 15 марта 2010

Это решение работает для SQL SERVER 2005/2008.

Вы должны создать таблицу с VARBINARY(MAX) в качестве одного из столбцов. В моем случае я создал таблицу Raporty со столбцом RaportPlik, равным VARBINARY(MAX) столбцу.

Ниже приведено несколько функций поддержки, которые вы можете изменить для своих нужд:

    public static void databaseFilePut(string varFilePath) {
        byte[] file;
        using (var stream = new FileStream(varFilePath, FileMode.Open, FileAccess.Read)) {
            using (var reader = new BinaryReader(stream)) {
                file = reader.ReadBytes((int) stream.Length);

            }

        }
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlWrite = new SqlCommand("INSERT INTO Raporty (RaportPlik) Values(@File)", varConnection)) {
            sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
            sqlWrite.ExecuteNonQuery();
        }
    }
    public static void databaseFileRead(string varID, string varPathToNewLocation) {
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) {
            sqlQuery.Parameters.AddWithValue("@varID", varID);
            using (var sqlQueryResult = sqlQuery.ExecuteReader())
                if (sqlQueryResult != null) {
                    sqlQueryResult.Read();
                    var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
                    sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
                    using (var fs = new FileStream(varPathToNewLocation, FileMode.Create, FileAccess.Write)) fs.Write(blob, 0, blob.Length);
                }
        }
    }
    public static MemoryStream databaseFileRead(string varID) {
        MemoryStream memoryStream = new MemoryStream();
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) {
            sqlQuery.Parameters.AddWithValue("@varID", varID);
            using (var sqlQueryResult = sqlQuery.ExecuteReader())
                if (sqlQueryResult != null) {
                    sqlQueryResult.Read();
                    var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
                    sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
                    //using (var fs = new MemoryStream(memoryStream, FileMode.Create, FileAccess.Write)) {
                    memoryStream.Write(blob, 0, blob.Length);
                    //}
                }
        }
        return memoryStream;
    }

Первый способ - поместить файл в базу данных с диска, второй - получить файл и сохранить его на диске, а третий - получить файл из базы данных и указать его как MemoryStream, чтобы вы могли использовать другие возможности затем просто пишу это на диск.

Этот 4-й метод помещает MemoryStream в базу данных:

public static int databaseFilePut(MemoryStream fileToPut) {
        int varID = 0;
        byte[] file = fileToPut.ToArray();
        const string preparedCommand = @"
                    INSERT INTO [dbo].[Raporty]
                               ([RaportPlik])
                         VALUES
                               (@File)
                        SELECT [RaportID] FROM [dbo].[Raporty]
            WHERE [RaportID] = SCOPE_IDENTITY()
                    ";
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlWrite = new SqlCommand(preparedCommand, varConnection)) {
            sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;

            using (var sqlWriteQuery = sqlWrite.ExecuteReader())
                while (sqlWriteQuery != null && sqlWriteQuery.Read()) {
                    varID = sqlWriteQuery["RaportID"] is int ? (int) sqlWriteQuery["RaportID"] : 0;
                }
        }
        return varID;
    }
3 голосов
/ 15 марта 2010

Предполагая SQL 2005 или более позднюю версию, я бы использовал поле VarBinary (MAX). Передайте загруженный файл как байт [] в оператор вставки. По словам Microsoft, начиная с SQL 2005, хранение больших объемов данных (файлов и изображений) в БД больше не снижает производительность в значительной степени.

например:

public void SaveFileToDB(string description, byte[] file)
{
    using (SqlConnection con = new SqlConnection(conStr)
    {
        con.Open();
        using (SqlCommand cmd = con.CreateCommand())
        {
            cmd.Parameters.Add("@Description", SqlDbType.VarChar, description);
            cmd.Parameters.Add("@File", SqlDbType.VarBinary, file);
            cmd.CommandText = "UploadedFileUpdate";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.ExecuteNonQuery();
        }
    }
}

Если у вас SQL 2008, см. Предложение Рона Кляйна.

2 голосов
/ 15 марта 2010

MS SQL Server 2008 (и, наверное, выше) предлагает Тип данных FileStream . Просто Google для этого (или Bing это, что угодно :-)), я думаю, вы найдете то, что вам нужно.

0 голосов
/ 15 марта 2010

Вы можете использовать тип поля blob. Когда вы читаете файл из StreamReader, преобразуйте его в байтовый массив, а затем вставьте его в поле большого двоичного объекта.

Обратный порядок действий, когда вы хотите прочитать его, получить большой двоичный объект в виде байтового массива, прочитать его в потоковом считывателе и записать его в буфер ответов.

0 голосов
/ 15 марта 2010

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

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

...