データベースへの BLOB 値の書き込み

データ ソースのフィールドの型に応じて、バイナリ データまたは文字データとして、BLOB (バイナリ ラージ オブジェクト) をデータベースに書き込むことができます。BLOB 値をデータベースに書き込むには、適切な INSERT または UPDATE ステートメントを実行し、入力パラメータとして BLOB 値を渡します (「コマンドによるストアド プロシージャの使用」を参照)。BLOB が、SQL Server の text フィールドなどのようにテキストとして格納される場合は、文字列パラメータとして BLOB を渡すことができます。BLOB が、SQL Server の image フィールドなどのようにバイナリ形式で格納される場合は、バイナリ パラメータとして byte 型の配列を渡すことができます。

メモ   BLOB が非常に大きい場合は、単一の値として書き込むと大量のシステム メモリが使用され、アプリケーションのパフォーマンスが低下することがあります。BLOB 値の書き込み時に使用されるメモリ量を減らすために、BLOB を "チャンク" 単位でデータベースに書き込むことができます。この方法で BLOB をデータベースに書き込む処理は、使用しているデータ ソースの機能によって異なります。"チャンク" 単位で BLOB 値を SQL Server に書き込む例については、「SQL Server に BLOB 値を書き込むときのリソースの節約」を参照してください。

Northwind データベースの Employees テーブルに従業員情報を追加するサンプル コードを次に示します。従業員の写真がファイルから読み取られ、テーブルの Photo フィールド (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;
  }
}

参照

.NET Framework データ プロバイダによるデータのアクセス | データベースからの BLOB 値の取得 | OleDbCommand クラス| OdbcCommand クラス | SqlCommand クラス