Как я могу присоединять файл PDF в реестр BD в SQL с C#?

Необходимость, которая у меня есть, состоит в том, чтобы знать, существует ли какая-то возможность присоединять файлы PDF или любой тип файла в реестр BD в SQL Server 2008 R2 с приложения C#, сделанного с VS 2012.

3
задан 10.02.2016, 00:42
4 ответа

В действительности не важно ей versiГіn из IDE, который ты используешь, с C # ты можешь делать много вещей, и между ними ты можешь предпочитать последовательно преобразовывать файл (PDF или любой другой) в цепь Base64 и сохранять ее как будто это был string:


using System;
using System.IO;

public class Serializador
{
    public static bool GuardarArchivo(string archivo)
    {
        // Leemos todos los bytes del archivo y luego lo guardamos como Base64 en un string.
        string resultado = Convert.ToBase64String(File.ReadAllBytes(archivo));

        using (var cn = 
            new SqlConnection(ConfigurationManager.ConnectionStrings[0].ConnectionString))
        {
            using(var cmd = cn.CreateCommand())
            {
                // Se invoca a un StoreProcedure para insertar el registro.
                cmd.CommandText = "usp_InsertArchivo";
                cmd.CommandType = CommandType.StoreProcedure;
                // Con la ayuda de FileInfo devolvemos unicamente el nombre del archivo.
                cmd.Parameters.AddWithValue("@nombreArchivo", new FileInfo(archivo).Name);
                // El resultado serializado del archivo pasa como un varchar cualquiera.
                cmd.Parameters.AddWithValue("@contenido", resultado);

                cn.Open();

                int cantidad = cmd.ExecuteNonQuery();

                // Si es mayor a 0 entonces se guardo correctamente.
                return (cantidad > 0);
            }
        }
    }

}
1
ответ дан 24.11.2019, 14:54
  • 1
    Какого преимущества добились бы, записав файл как base64 из-за того, что, на бинарный сохраняться прямо? если определяется поле varbinary, он был бы прямым без какого-либо превращения типов, байт [такой] как параметр – Leandro Tuttini 10.02.2016, 18:18
  • 2
    Преимущество быть и # 237; в который это мультиплатформа, например, если ты хотел восстановить файл в устройстве м и # 243; подлый в trav и # 233; s услуги WCF – ErickOrlando 10.02.2016, 18:28
  • 3
    Но если это немного movile, он мог бы конвертировать в base64 в момент посылания файла, и а он movile посылает себе прямо байт []. Кроме того WCF может посылать бинарного прямо как часть DataContract, услуга применяет к нему encode прямо. Больше, что у меня совсем не есть сомнение, потому что base64 он занимает больше место хранения. – Leandro Tuttini 10.02.2016, 18:42

Да, возможно. У тебя есть три альтернативы:

  1. Хранить файл прямо в базе данных как тип Blob и хранить бинарного прямо.

  2. Хранить файл прямо в базе данных с типом FileStream.

  3. Хранить файл к диску и сохранять маршрут файла в поле твоей таблицы в базе данных.

У каждой альтернативы есть Ваш pros и contras после нескольких дискуссий по этому поводу. Более рекомендуемая, что я увидел для SQL Server (по крайней мере на изображениях, но он применяется к любому типу файла), это вторая. В случае, что ты не использовал SQL Server, второй выбор остается отказавшимся и он рекомендовал бы тебе третью, потому что он облегчает содержание файлов, база данных не является такой тяжелой, существует расставание тем, облегчает доказательства, и т.д.

Здесь больше информации по этому поводу: https://stackoverflow.com / q / 3748/1065197

2
ответ дан 24.11.2019, 14:54

Если возможно, хотя он не является рекомендуемым

Ты можешь объявлять твою колонну как VARBINARY в Sql

И код, чтобы пересылать файл, был бы больше или meno был бы нечто похожим:

byte[] byteArray = cargarArchivo(); //Regresa tu archivo como un arreglo de bytes
var command = new SqlCommand("Insert Into Tu_Tabla columna_archivo Values (@archivo)" , sqlConection); // Creamos un SqlCommand que tenga un insert comun, pero apuntando a la columna
command.Parameters.Add("@archivo", SqlDbType.VarBinary, byteArray.Length).Value = byteArray; //Pasamos la referencia del arreglo de bytes
command.ExecuteNonQuery();// Y ejecutamos el query sin retorno

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

Здесь покрывает эта тема на английском, дай ему взгляд ;)

2
ответ дан 24.11.2019, 14:54

AquГ -

[ASP.NET] Записывать Файл в базе данных

объяснило, как ты мог бы вводить файл внутри поля в таблице

Как края, определяется в таблице поле типа varbinary и чтобы вводить, ты должен перемещать из-за параметра array байт INSERT.

, Если ты aplicaciГіn winforms, - очень простой одинокий ты используешь File. ReadAllBytes ()

В примере соединения cГіdigo, что оказывается полезной эта в слое настойчивости

    public static void Guardar(string nombrearchivo, int length, byte[] archivo)
    {
        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
        {
            conn.Open();

            string query = @"INSERT INTO Archivos (nombre, length, archivo)
                             VALUES (@name, @length, @archivo)";

            SqlCommand cmd = new SqlCommand(query, conn);

            cmd.Parameters.AddWithValue("@name", nombrearchivo);
            cmd.Parameters.AddWithValue("@length", length);

            SqlParameter archParam = cmd.Parameters.Add("@archivo", SqlDbType.VarBinary);
            archParam.Value = archivo;

            cmd.ExecuteNonQuery();

        }

    }

производя параметр в INSERT, который позволял бы распределять байт [] файла


Кроме того recomendarГ - в validades, а тебе кажется полезным, его определяет поле как FileStream, из-за версии Sql Server, о которых ты упоминаешь, ты можешь использовать это и это больше Гіptimo во время регистрирования файлов в db.

Ан Интродуктион to SQL Сервер Филестреам

Ов До I: Использовал SQL Филе Стреам

1
ответ дан 24.11.2019, 14:54