C#でサクッと解説!SQL ServerのVARBINARY列にバイト配列を挿入する方法
SQL Server の VARBINARY 列にバイト配列を挿入する方法
SQL Server には、バイナリ データを格納するために VARBINARY
データ型が用意されています。 VARBINARY
列にバイト配列を挿入するには、いくつかの方法があります。 このチュートリアルでは、最も一般的な 2 つの方法について説明します。
方法 1: SqlParameter を使用する
この方法は、ADO.NET を使用して SQL Server とやり取りする場合に適しています。
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string sql = "INSERT INTO MyTable (MyVARBINARYColumn) VALUES (@MyVARBINARYParameter)";
SqlCommand command = new SqlCommand(sql, connection);
SqlParameter parameter = new SqlParameter("@MyVARBINARYParameter", SqlDbType.VARBINARY);
parameter.Value = myByteArray;
command.Parameters.Add(parameter);
command.ExecuteNonQuery();
}
方法 2: SQL Server Native Client を使用する
この方法は、SQL Server Native Client を使用して SQL Server とやり取りする場合に適しています。
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string sql = "INSERT INTO MyTable (MyVARBINARYColumn) VALUES (@MyVARBINARYParameter)";
SqlCommand command = new SqlCommand(sql, connection);
SqlBinary parameter = new SqlBinary(myByteArray);
command.Parameters.AddWithValue("@MyVARBINARYParameter", parameter);
command.ExecuteNonQuery();
}
- SQL Server 2008 以降を使用している場合は、
VARBINARY(MAX)
データ型を使用することもできます。VARBINARY(MAX)
は、最大 2GB までのバイナリ データを格納できます。 - バイト配列が
VARBINARY
列の最大サイズよりも大きい場合は、エラーが発生します。 VARBINARY
列のサイズは、挿入するバイト配列よりも大きくなければなりません。
例
次の例では、MyTable
テーブルの MyVARBINARYColumn
列にバイト配列を挿入する方法を示します。
byte[] myByteArray = new byte[] { 0x20, 0x40, 0x60, 0x80 };
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string sql = "INSERT INTO MyTable (MyVARBINARYColumn) VALUES (@MyVARBINARYParameter)";
SqlCommand command = new SqlCommand(sql, connection);
SqlParameter parameter = new SqlParameter("@MyVARBINARYParameter", SqlDbType.VARBINARY);
parameter.Value = myByteArray;
command.Parameters.Add(parameter);
command.ExecuteNonQuery();
}
このコードは、次の SQL ステートメントを実行します。
INSERT INTO MyTable (MyVARBINARYColumn) VALUES (0x20, 0x40, 0x60, 0x80)
using System;
using System.Data.SqlClient;
namespace InsertByteArrayToSqlServer
{
class Program
{
static void Main(string[] args)
{
// 接続文字列を設定
string connectionString = "Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=True";
// バイト配列を作成
byte[] byteArray = new byte[] { 0x20, 0x40, 0x60, 0x80 };
// SQL Server に接続
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// INSERT ステートメントを作成
string sql = "INSERT INTO MyTable (MyVARBINARYColumn) VALUES (@ByteArrayParameter)";
// SqlCommand オブジェクトを作成
using (SqlCommand command = new SqlCommand(sql, connection))
{
// SqlParameter オブジェクトを作成
SqlParameter parameter = new SqlParameter("@ByteArrayParameter", SqlDbType.VARBINARY);
parameter.Value = byteArray;
// パラメータをコマンドに追加
command.Parameters.Add(parameter);
// INSERT ステートメントを実行
command.ExecuteNonQuery();
}
}
Console.WriteLine("バイト配列を SQL Server に挿入しました。");
}
}
}
このコードの説明
- 最初に、
SqlConnection
クラスを使用してSQL Server
データベースへの接続を確立します。 接続文字列は、connectionString
変数に格納されます。 - 次に、
byte[]
型の変数byteArray
を作成し、挿入するバイト配列を格納します。 - 続いて、
INSERT
ステートメントを作成して、バイト配列をMyTable
テーブルのMyVARBINARYColumn
列に挿入します。 - 次に、
SqlCommand
オブジェクトを作成して、INSERT
ステートメントを実行します。 - 次に、
SqlParameter
オブジェクトを作成して、挿入するバイト配列を格納します。 - 最後に、
SqlParameter
オブジェクトをSqlCommand
オブジェクトのパラメーター コレクションに追加し、INSERT
ステートメントを実行します。
注記
- 挿入するバイト配列のサイズが
MyVARBINARYColumn
列のサイズよりも大きくならないようにしてください。 MyTable
テーブルとMyVARBINARYColumn
列が存在することを確認してください。- このコードは、.NET Framework 4.6 以降が必要です。
SqlBulkCopy
クラスを使用すると、大量のデータを SQL Server に効率的に挿入できます。 この方法は、バイト配列を含む大量のデータを挿入する場合に適しています。
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// SqlBulkCopy オブジェクトを作成
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
// ターゲット テーブルを設定
bulkCopy.DestinationTableName = "MyTable";
// バイト列のマッピングを設定
bulkCopy.ColumnMappings.Add("MyVARBINARYColumn", "MyVARBINARYColumn");
// データ ソースを設定
using (DataTable dataTable = new DataTable())
{
// データ テーブルに列を追加
dataTable.Columns.Add("MyVARBINARYColumn", typeof(byte[]));
// データ テーブルに行を追加
dataTable.Rows.Add(byteArray);
// SqlBulkCopy オブジェクトにデータ テーブルをロード
bulkCopy.WriteToServer(dataTable);
}
}
}
FileStream データ型を使用する
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// INSERT ステートメントを作成
string sql = "INSERT INTO MyTable (MyVARBINARYColumn) VALUES (@FileStreamParameter)";
// SqlCommand オブジェクトを作成
using (SqlCommand command = new SqlCommand(sql, connection))
{
// SqlParameter オブジェクトを作成
SqlParameter parameter = new SqlParameter("@FileStreamParameter", SqlDbType.FileStream);
// ファイル ストリームを開く
using (FileStream fileStream = new FileStream(@"C:\MyFile.txt", FileMode.Open, FileAccess.Read))
{
// ファイル ストリームをパラメータに割り当てる
parameter.Value = fileStream;
// パラメータをコマンドに追加
command.Parameters.Add(parameter);
// INSERT ステートメントを実行
command.ExecuteNonQuery();
}
}
}
OPENROWSET 関数を使用する
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// INSERT ステートメントを作成
string sql = "INSERT INTO MyTable (MyVARBINARYColumn) " +
"SELECT * FROM OPENROWSET('BULK', 'C:\MyFile.txt', FORMAT='TEXT') AS MyTable";
// SqlCommand オブジェクトを作成
using (SqlCommand command = new SqlCommand(sql, connection))
{
// INSERT ステートメントを実行
command.ExecuteNonQuery();
}
}
これらの方法は、それぞれ異なる利点と欠点があります。 ニーズに合った方法を選択してください。
- SQL Server にバイト配列を挿入する方法の詳細については、Microsoft のドキュメントを参照してください。
- 上記のコード例はほんの一例です。 ご自身のニーズに合わせてコードを調整する必要があります。
arrays sql-server