文字列連結を使用しているため、バイナリデータがインサートに適切に渡されていませんrawData.ToString()
。おそらくTypeNameを出力するだけです(したがって、バイナリデータの長さはファイルサイズが3000バイトを超えるのに対し、13バイトです)。代わりにこれを試してください:
byte[] rawData = File.ReadAllBytes(@"d:\Untitled.gif");
FileInfo info = new FileInfo(@"d:\Untitled.gif");
int fileSize = Convert.ToInt32(info.Length);
using(MySqlConnection connection = new MySqlConnection("server=192.168.1.104;uid=root;pwd=root;database=cady234;"))
{
using(MySqlCommand command = new MySqlCommand())
{
command.Connection = connection;
command.CommandText = "INSERT INTO file (file_name, file_size, file) VALUES (?fileName, ?fileSize, ?rawData);";
MySqlParameter fileNameParameter = new MySqlParameter("?fileName", MySqlDbType.VarChar, 256);
MySqlParameter fileSizeParameter = new MySqlParameter("?fileSize", MySqlDbType.Int32, 11);
MySqlParameter fileContentParameter = new MySqlParameter("?rawData", MySqlDbType.Blob, rawData.Length);
fileNameParameter.Value = "test name";
fileSizeParameter.Value = fileSize;
fileContentParameter.Value = rawData;
command.Parameters.Add(fileNameParameter);
command.Parameters.Add(fileSizeParameter);
command.Parameters.Add(fileContentParameter);
connection.Open();
command.ExecuteNonQuery();
}
}
ここでは、いくつかの概念を紹介しました。まず、すべてのバイナリデータを一度にロードする場合は、静的メソッドFile.ReadAllBytesを使用するだけです。コードははるかに少なくなります。
第二に、毎回完全修飾名前空間を使用する必要はありません-using
ディレクティブを使用してください
第三に、(少し紛らわしいことに)C#にもusingステートメントがあります。これにより、IDisposableを実装するすべてのオブジェクトがそれ自体の後で適切にクリーンアップされます。接続の場合、コマンドが成功または失敗すると、明示的にCloseandDisposeを呼び出します。
最後に、クエリをパラメータ化しました。パラメータは多くの理由で役立ちます。これらはSQLインジェクションからの保護に役立ち、この場合、データ型が正しく処理されることも保証する必要があります。SqlParameterの詳細を読むことができます(MySqlParameterはデータベース固有の実装ですが、同じ原則を使用します)。
.Net4で実行されているMySQL5.5.15、MySQLConnector5.2.7で動作することをテストしました