初めて SQL Compact 4.0 を使用しており、IMAGE 列にデータを挿入しようとしていますが、ほとんどのデータは約 50k バイトです。
私が得ている問題は、画像列が十分に大きいはずなのに、データが 8000 バイトに切り捨てられていることです。
SqlCeParameter を使用してデータを挿入しています。サイズは byte[] (43402) の長さと一致するように設定されており、SqlDbType は SqlDbType.Image です。
データベースでは、すべての行が 8000 バイトです (datalength 関数を使用)。
これは、データベース スキーマ自体にあると思われます。おそらく、IMAGE 列に設定されたデフォルトのサイズであり、うまくいけばオーバーライドできます。興味深いことに、パラメーターにはベース DbType.Binary があります (Microsoft によれば、これは 8000 バイトに制限されています)。
====
画像を追加できなかったので、うーん。さらに詳しい情報は次のとおりです。
コマンドをビルドするコードは次のとおりです。_params は、各パラメーター名とデータを含む単なる辞書です。
var cmd = connection.CreateCommand();
cmd.CommandText = _command;
foreach(var p in _params)
{
var param = SqlHelper.CreateSqlCeParameter(p);
cmd.Parameters.Add(param);
if(param.SqlDbType == System.Data.SqlDbType.Image)
{
param.Size = (p.Value as byte[]).Length;
}
}
cmd.ExecuteNonQuery();
このヘルパー クラスを使用してパラメーターを作成します。
public class SqlHelper
{
public static SqlDbType MapToSqlCeType(object data)
{
if(data.GetType() == typeof(string))
{
return SqlDbType.NVarChar;
}
if(data.GetType() == typeof(byte[]))
{
return SqlDbType.Image;
}
return SqlDbType.NVarChar;
}
internal static SqlCeParameter CreateSqlCeParameter(KeyValuePair<string, object> data)
{
return new SqlCeParameter(data.Key, SqlHelper.MapToSqlCeType(data.Value))
{
Value = data.Value
};
}
}
チェックに使用しているSQL: SELECT top 10 datalength([Data]) FROM [Datamodule]; 行く
結果: 列 1 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000