我第一次使用SQL Compact 4.0并尝试将数据插入IMAGE列,大部分数据大约为50k字节。
我遇到的问题是虽然图像列应该足够大,但数据被截断为8000字节。
我正在使用SqlCeParameter来插入数据。大小已设置为匹配byte [](43402)的长度,SqlDbType是SqlDbType.Image。
在数据库中,您可以看到所有行都是8000字节(使用datalength函数)。
我怀疑这是数据库模式本身的一些东西,也许是为IMAGE列设置的默认大小,我希望可以覆盖它。有趣的是注意参数有基础DbType.Binary - 根据微软限制为8000字节 - 可能是红鲱鱼!
====
由于我无法添加任何图像,grrrr。以下是一些更多信息:
以下是构建命令的代码。 _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前10个数据长度([Data]) 来自[Datamodule]; GO
结果: 列1 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000
答案 0 :(得分:0)
我认为这是一个问题,这与我创建SqlCeParameter的方式有关。
如果我只使用名称和值构建参数,则将SqlDbType设置为VarBinary(默认情况下),这会将所有数据插入到IMAGE类型列中。
因此使用以下代码可以正常工作:
var cmd = connection.CreateCommand();
cmd.CommandText = _command;
foreach (var p in _params)
{
cmd.Parameters.Add(new SqlCeParameter(p.Key, p.Value));
}
cmd.ExecuteNonQuery();
而不是将SqlDbType显式设置为Image,VarBinary似乎可以完成这项工作。我之前曾尝试通过脚本升级数据库并转换/转换数据,因为VARBINARY已将其截断为4000字节,这就是为什么我首先沿着这条路线走下去。
感谢您的帮助。