SQL Server Compact 4.0 图像列被截断为 8000

Posted

技术标签:

【中文标题】SQL Server Compact 4.0 图像列被截断为 8000【英文标题】:SQL Server Compact 4.0 image column truncated to 8000 【发布时间】:2015-08-07 15:54:37 【问题描述】:

我第一次使用 SQL Compact 4.0 并尝试将数据插入到 IMAGE 列中,并且大部分数据约为 50kbytes。

我遇到的问题是,虽然图像列应该足够大,但数据被截断为 8000 字节。

我正在使用 SqlCeParameter 插入数据。大小已设置为匹配 byte[] (43402) 的长度,SqlDbType 为 SqlDbType.Image。

在你可以看到的数据库中,所有的行都是 8000 字节(使用 datalength 函数)。

我怀疑这是数据库架构本身的问题,也许是为 IMAGE 列设置的默认大小,我希望可以覆盖它。有趣的是,该参数具有基本 DbType.Binary - 根据 Microsoft 的规定,它限制为 8000 字节 - 可能是红鲱鱼!

====

因为我无法添加任何图像,grrrrr。以下是更多信息:

这是我构建命令的代码。 _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: 选择前 10 个数据长度([数据]) FROM [数据模块]; 去吧

结果: 第 1 列 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000

【问题讨论】:

图像列最大为 1 GB。你能展示一下参数是如何构建的,也许那里有一个错误?显式设置 SqlDbType 很重要 我已经添加了上面的代码来演示如何创建参数。我可以确认命令上的参数在命令执行时看起来一切正常。 【参考方案1】:

我想通了,这是我创建 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();

VarBinary 似乎可以完成这项工作,而不是显式地将 SqlDbType 设置为 Image。我之前曾尝试通过脚本升级数据库并将数据转换/转换为 VARBINARY 已将其截断为 4000 字节,这就是我首先走这条路的原因。

感谢您的帮助。

【讨论】:

显式设置 DbType 也可以:param.DbType = SqlDbType.Image;

以上是关于SQL Server Compact 4.0 图像列被截断为 8000的主要内容,如果未能解决你的问题,请参考以下文章

如何部署 SQL Server Compact Edition 4.0?

SQL Compact 4.0 和 Entity Framework 4.0:图像/Blob 限制?

更改 SQL Server Compact 4.0 的排序规则

SQL Server Compact 4.0 DateTime 精度不包括秒

缺少 Sql Server Compact 4.0 提供程序

nlog 和 SQL Server Compact 4.0 的示例配置