Partager via


Écriture de valeurs BLOB dans une base de données

Vous pouvez écrire des objets binaires volumineux (BLOB) dans une base de données sous forme de données de type binaire ou caractère en fonction du type du champ de votre source de données. Pour écrire une valeur BLOB dans votre base de données, utilisez l'instruction INSERT ou UPDATE appropriée et passez la valeur BLOB en tant que paramètre d'entrée (consultez Utilisation des procédures stockées avec une commande). Si le BLOB est stocké sous forme de texte, dans le cas, par exemple, d'un champ SQL Server text, vous pouvez le passer en tant que paramètre de chaîne. Si le BLOB est stocké sous forme binaire, dans le cas, par exemple, d'un champ SQL Server image, vous pouvez passer un tableau de type byte en tant que paramètre binaire.

Remarque   Un BLOB peut parfois être très volumineux et donc consommer une grande quantité de mémoire système lorsqu'il est écrit en tant que valeur unique, ce qui a une incidence négative sur les performances de l'application. Pour réduire la quantité de mémoire utilisée, il est donc courant d'écrire le BLOB dans la base de données en segments. La procédure d'écriture dépend dans ce cas des fonctionnalités de la source de données. Pour obtenir un exemple d'écriture d'une valeur BLOB dans SQL Server en segments, consultez Préservation des ressources lors de l'écriture des valeurs BLOB dans SQL Server.

L'exemple de code suivant ajoute les informations relatives à un employé dans la table Employees de la base de données Northwind. Une photo de l'employé est lue dans le fichier et ajoutée dans le champ Photo de la table, un champ de type image.

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO

Public Class EmployeeData

  Public Shared Sub Main()
    Dim hireDate As DateTime = DateTime.Parse("5/21/99")
    AddEmployee("Jones", "Mary", "Sales Representative", hireDate, 5, "jones.bmp")
  End Sub

  Public Shared Sub AddEmployee(lastName As String, firstName As String, title As String, hireDate As DateTime, _
                                reportsTo As Integer, photoFilePath As String)

    Dim photo() as Byte = GetPhoto(photoFilePath)

    Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;")

    Dim addEmp As SqlCommand = New SqlCommand("INSERT INTO Employees (LastName, FirstName, Title, HireDate, ReportsTo, Photo) " & _
                                              "Values(@LastName, @FirstName, @Title, @HireDate, @ReportsTo, @Photo)", nwindConn) 

    addEmp.Parameters.Add("@LastName",  SqlDbType.NVarChar, 20).Value = lastName
    addEmp.Parameters.Add("@FirstName", SqlDbType.NVarChar, 10).Value = firstName
    addEmp.Parameters.Add("@Title",     SqlDbType.NVarChar, 30).Value = title
    addEmp.Parameters.Add("@HireDate",  SqlDbType.DateTime).Value     = hireDate
    addEmp.Parameters.Add("@ReportsTo", SqlDbType.Int).Value          = reportsTo

    addEmp.Parameters.Add("@Photo",     SqlDbType.Image, photo.Length).Value = photo

    nwindConn.Open()

    addEmp.ExecuteNonQuery()

    nwindConn.Close()
  End Sub

  Public Shared Function GetPhoto(filePath As String) As Byte()
    Dim fs As FileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)
    Dim br As BinaryReader = new BinaryReader(fs)

    Dim photo() As Byte = br.ReadBytes(fs.Length)

    br.Close()
    fs.Close()

    Return photo
  End Function
End Class
[C#]
using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;

public class EmployeeData
{
  public static void Main()
  {
    DateTime hireDate = DateTime.Parse("5/21/99");
    AddEmployee("Jones", "Mary", "Sales Representative", hireDate, 5, "jones.bmp");
  }

  public static void AddEmployee(string lastName, string firstName, string title, DateTime hireDate , int reportsTo, string photoFilePath)
  {
    byte[] photo = GetPhoto(photoFilePath);

    SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;");

    SqlCommand addEmp = new SqlCommand("INSERT INTO Employees (LastName, FirstName, Title, HireDate, ReportsTo, Photo) " +
                                       "Values(@LastName, @FirstName, @Title, @HireDate, @ReportsTo, @Photo)", nwindConn); 

    addEmp.Parameters.Add("@LastName",  SqlDbType.NVarChar, 20).Value = lastName;
    addEmp.Parameters.Add("@FirstName", SqlDbType.NVarChar, 10).Value = firstName;
    addEmp.Parameters.Add("@Title",     SqlDbType.NVarChar, 30).Value = title;
    addEmp.Parameters.Add("@HireDate",  SqlDbType.DateTime).Value     = hireDate;
    addEmp.Parameters.Add("@ReportsTo", SqlDbType.Int).Value          = reportsTo;

    addEmp.Parameters.Add("@Photo",     SqlDbType.Image, photo.Length).Value = photo;

    nwindConn.Open();

    addEmp.ExecuteNonQuery();

    nwindConn.Close();
  }

  public static byte[] GetPhoto(string filePath)
  {
    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    BinaryReader br = new BinaryReader(fs);

    byte[] photo = br.ReadBytes((int)fs.Length);

    br.Close();
    fs.Close();

    return photo;
  }
}

Voir aussi

Utilisation des fournisseurs de données .NET Framework pour l'accès aux données | Obtention de valeurs BLOB à partir d'une base de données | OleDbCommand, classe | OdbcCommand, classe | SqlCommand, classe