Столбец изображения SQL Server Compact 4.0 урезан до 8000

Я впервые работаю с SQL Compact 4.0 и пытаюсь вставить данные в столбец IMAGE, и большая часть данных составляет около 50 Кбайт.

Проблема, которую я получаю, состоит в том, что, хотя столбец изображения должен быть достаточно большим, данные усекаются до 8000 байт.

Я использую SqlCeParameter для вставки данных. Размер был установлен равным длине байта [] (43402), а SqlDbType - SqlDbType.Image.

В базе данных, которую вы видите, все строки имеют размер 8000 байт (используя функцию длины данных).

Я подозреваю, что это что-то в самой схеме базы данных, возможно, установленный по умолчанию размер для столбцов 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();

Используя этот вспомогательный класс для создания параметров:

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 лучших длин данных ([Data]) FROM [Datamodule]; ИДТИ

Результаты: Столбец1 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000

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();

Вместо того, чтобы явно устанавливать SqlDbType в Image, VarBinary, кажется, делает эту работу. Ранее я пытался обновить базу данных с помощью сценария и преобразовать / преобразовать данные, так как VARBINARY урезал их до 4000 байтов, поэтому я пошел по этому пути в первую очередь.

Спасибо за помощь.

Другие вопросы по тегам