SQL Server Compact 4.0映像列截断为8000

时间:2015-08-07 15:54:38

标签: c# sql-server-ce sql-server-ce-4 sql-server-ce-toolbox

我第一次使用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

1 个答案:

答案 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字节,这就是为什么我首先沿着这条路线走下去。

感谢您的帮助。