SQL Server Compact 4.0 图像列被截断为 8000
SQL Server Compact 4.0 image column truncated to 8000
我是第一次使用 SQL Compact 4.0 并尝试将数据插入 IMAGE 列,但大部分数据大约为 50kbytes。
我遇到的问题是,尽管图像列应该足够大,但数据被截断为 8000 字节。
我正在使用 SqlCeParameter 插入数据。大小已设置为匹配 byte[] (43402) 的长度并且 SqlDbType 为 SqlDbType.Image.
在数据库中可以看到所有行都是8000字节(使用datalength函数)。
我怀疑这是数据库模式本身的问题,也许是为 IMAGE 列设置的默认大小,我希望可以覆盖它。有趣的是,该参数具有基数 DbType.Binary - 根据 Microsoft 限制为 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();
使用这个助手 class 创建参数:
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 个数据长度([数据])
来自 [数据模块];
去
结果:
专栏1
8000
8000
8000
8000
8000
8000
8000
8000
8000
8000
我发现了这一点,这是我创建 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 来完成这项工作。我之前曾尝试通过脚本和 converting/casting 升级数据库,因为 VARBINARY 将其截断为 4000 字节,这就是为什么我首先走这条路的原因。
感谢您的帮助。
我是第一次使用 SQL Compact 4.0 并尝试将数据插入 IMAGE 列,但大部分数据大约为 50kbytes。
我遇到的问题是,尽管图像列应该足够大,但数据被截断为 8000 字节。
我正在使用 SqlCeParameter 插入数据。大小已设置为匹配 byte[] (43402) 的长度并且 SqlDbType 为 SqlDbType.Image.
在数据库中可以看到所有行都是8000字节(使用datalength函数)。
我怀疑这是数据库模式本身的问题,也许是为 IMAGE 列设置的默认大小,我希望可以覆盖它。有趣的是,该参数具有基数 DbType.Binary - 根据 Microsoft 限制为 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();
使用这个助手 class 创建参数:
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 个数据长度([数据]) 来自 [数据模块]; 去
结果: 专栏1 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000
我发现了这一点,这是我创建 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 来完成这项工作。我之前曾尝试通过脚本和 converting/casting 升级数据库,因为 VARBINARY 将其截断为 4000 字节,这就是为什么我首先走这条路的原因。
感谢您的帮助。