Столбец изображения 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 байтов, поэтому я пошел по этому пути в первую очередь.
Спасибо за помощь.