[+/-]
MySQL
の一般的な使い方のひとつに、BLOB
カラムのバイナリ
データの保管があります。MySQL は 4 種類の BLOB
データタイプをサポートしています
:TINYBLOB
、BLOB
、MEDIUMBLOB
、および
LONGBLOB
。
BLOB カラムに保管されたデータには、Connector/NET を使ってアクセスすることができ、クライアント側コードで操作することができます。BLOB データで Connector/NET を使用するための特別な条件はありません。
簡単なコードの例は、このセクションに記載されています。アプリケーションの完全なサンプルは、Connector/NET
インストレーションの Samples
ディレクトリでご覧いただけます。
まず最初に、BLOB データで MySQL を使用すると、サーバが構成されます。アクセスするテーブルの作成から始めましょう。例に取り上げるファイル テーブルには、4 つのカラムがあります :ファイルを特定するプライマリ キーとして作動する、適切なサイズ (UNSIGNED SMALLINT) の AUTO_INCREMENT カラム、ファイル名を保管する VARCHAR カラム、ファイルのサイズを保管する UNSIGNED MEDIUMINT カラム、そしてファイルそのものを保管する MEDIUMBLOB カラム。例えば、次のテーブル定義を使用するとします :
NotOverridable Public Property ConnectionString As String _ _ Implements IDbConnection.ConnectionString
テーブルを作成した後、max_allowed_packet システム変数を改変しなければならない場合があります。この変数は、MySQL サーバに遅れるパケットの大きさ ( 例 : 1 行 ) を特定します。デフォルトでは、サーバーは最大 1 メガのサイズしかクライアント アプリケーションから受け入れないようになっています。1 メガを越えることがないようならば、これで問題ありません。1 メガを越えるファイルを転送する場合は、この数字を上げる必要があります。
max_allowed_packet オプションは、MySQL
Administrator's Startup Variables
画面で改変することができます。Networking
タブの Memory セクションにある Maximum Allowed
オプションを、適切な設定に調節します。値を調節したら、Apply
Changes ボタンをクリックし、MySQL
Administrator の Service Control
画面でサーバを再起動します。また、my.cnf
ファイルで直接この値を変えることもできます
( max_allowed_packet=xxM を読み取るラインを加える
) 。MySQL 内の SET max_allowed_packet=xxM;
シンタックスを使用しても値を調節できます。
BLOB データの転送には時間がかかることがあるので、max_allowed_packet の設定は慎重に行ってください。使用目的に適した値を設定し、必要に応じて値を上げるようにしてください。
データベースへファイルを書き込むには、ファイルをバイト列に変換し、そしてそのバイト列を
INSERT
クエリへのパラメータとして使用します。
次のコードは、FileStream
オブジェクトを使用してファイルを開き、バイト列に読み出して、それを
file
テーブルに挿入します :
Visual Basic 例 :
public string ConnectionString {get; set;}
C# 例 :
NotOverridable Public ReadOnly Property ConnectionTimeout As Integer _ _ Implements IDbConnection.ConnectionTimeout
FileStream
オブジェクトの
Read
メソッドは、ファイルを
FileStream オブジェクトの Length
プロパティによってサイズ分類されたバイト列にロードするために使われます。
バイト列を MySqlCommand
オブジェクトのパラメータとして割り当てた後、ExecuteNonQuery
メソッドが呼び出され、BLOB が
file
テーブルに挿入されます。
フィールドが file
テーブルにロードされたら、MySqlDataReader
クラスを使用してそれを取り出すことができます。
次のコードは file
テーブルからコードを取り出し、そしてそのデータを
FileStream
オブジェクトにロードしてディスクへ書き込みます
:
Visual Basic 例 :
public int ConnectionTimeout {get;}
C# 例 :
NotOverridable Public ReadOnly Property Database As String _ _ Implements IDbConnection.Database
接続後、file
テーブルのコンテンツは
MySqlDataReader
オブジェクトにロードされます。MySqlDataReader
の GetBytes
メソッドによって BLOB
がバイト列にロードされ、FileStream
オブジェクトを使ってディスクに書き込まれます。
MySqlDataReader の GetOrdinal
メソッドで、名前付きカラムの整数インデックスを定義することができます。SELECT
クエリのカラムの順が変更された場合、GetOrdinal
メソッドを使用すると、エラーを防ぐことができます。