Enregistrer des fichiers dans SQL Server 2008 en C#


Voici comment stocker sur un SQL server tous type de fichier. En fait, il suffit d’avoir un champ de type varbinary dans lequel on enregistrera un byte[] de notre fichier. Donc pas de choses spéciales sur ADO, juste deux méthodes. La première retournant un byte[] d’un fichier et la seconde écrivant dans un fichier un byte[]

public void writeFile(byte[] data, String fileName)
{
    using (BinaryWriter binWriter = new BinaryWriter(File.Open(fileName, FileMode.Create)))
    {
        binWriter.Write(data);
    }
}

public byte[] ReadFile(string sPath)
{
    byte[] data = null;
    FileInfo fInfo = new FileInfo(sPath);
    long numBytes = fInfo.Length;
    FileStream fStream = new FileStream(sPath, FileMode.Open, FileAccess.Read);
    BinaryReader br = new BinaryReader(fStream);
    data = br.ReadBytes((int)numBytes);
    return data;
}

Pour le principe, voici deux méthodes, upload et download qui les utilisent.

public void Download(string outputPath, string filename, string ConnectionString)
{
    // Connection
    SqlConnection CN = new SqlConnection(ConnectionString);

    // Creation de la requête
    string qry = "Select * from Files WHERE filename=@filename";
    SqlCommand SqlCom = new SqlCommand(qry, CN);
    SqlCom.Parameters.Add(new SqlParameter("@filename", (object)filename));
    SqlDataAdapter ADAP = new SqlDataAdapter(SqlCom.CommandText, CN);

    // Récupération des données
    DataSet DS = new DataSet();
    ADAP.Fill(DS, "Files");

    // Lecture des données
    foreach (DataRow dr in DS.Tables["Files"].Rows)
    {
        // enregistrement du fichier
        writeFile((byte[])dr["data"], outputPath + dr["filename"]);
    }
    CN.Close();
}

public void UploadNewFile(string sourcePath, string description, string ConnectionString)
{
    // Lecture du fichier
    byte[] data = ReadFile(sourcePath);

    // Nouvelle connection
    SqlConnection CN = new SqlConnection(ConnectionString);

    // Création de la requête
    string qry = "insert into Files(filename, data, description) values (@filename, @data, @description)";
    SqlCommand SqlCom = new SqlCommand(qry, CN);
    SqlCom.Parameters.Add(new SqlParameter("@filename", (object)sourcePath.Split('\\').Last()));
    SqlCom.Parameters.Add(new SqlParameter("@data", (object)data));
    SqlCom.Parameters.Add(new SqlParameter("@description", (object)description));

    // Ouverture, execution, fermeture
    CN.Open();
    SqlCom.ExecuteNonQuery();
    CN.Close();
}

Par extension, cette méthode devrait fonctionner sur n’importe quel SGBD capable d’enregistrer des données de type binaire. Si certains ont testé sous oracle, mysql, db2 et cie, je serais interessé de savoir ce qu’il en est ^^

One thought on “Enregistrer des fichiers dans SQL Server 2008 en C#

  1. check this out

    whoah this blog is fantastic i like reading your
    articles. Stay up the great work! You realize, lots of individuals are searching round for
    this info, you can aid them greatly.

    Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s