Я нашел следующий комментарий на the Dapper .NET project home page.Dapper и varchars
Dapper supports varchar params, if you are executing a where clause on a varchar column using a param be sure to pass it in this way:
Query<Thing>("select * from Thing where Name = @Name", new {Name =
new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });
On Sql Server it is crucial to use the unicode when querying unicode and ansi when querying non unicode
Я оценки щеголеватый для использования с устаревшей базой данных (SQL Server 2008), с большим количеством хранимых процедур с параметрами VARCHAR, и я немного смущен этим ограничением.
С ручным кодом ADO.NET, я использую следующий для приведенного выше запроса:
new SqlParameter("@Name", "abcde")
без указания, является ли это юникод или нет, ни длину.
Зачем мне нужен этот многословный синтаксис DbString с Dapper, указав длину столбца, IsFixedLength и IsAnsi?
Почему IsFixedLength = true для столбца varchar (я бы ожидал, что это будет true для столбца char или nchar)?
Должен ли я использовать DbString, как это для параметров хранимой процедуры?
Я ожидал Щеголеватый сделать мой DAL код более кратким, но это, кажется, делает его более многословным параметров VARCHAR.
UPDATE
Я исследовал немного дальше, чтобы попытаться понять, почему Щеголеватый бы это ограничение VARCHAR, что я, кажется, не в моей ручной работы кода, где я обычно создать входной параметр следующим образом:
var parameter = factory.CreateParameter(); // Factory is a DbProviderFactory
parameter.Name = ...;
parameter.Value = ...;
и обычно оставляют поставщика, чтобы вывести DbType
используя свои собственные правила, если я специально не хочу принуждать его.
Глядя на DynamicParameters
класса щеголеватый, он имеет метод AddParameters
, который создает параметры следующим образом:
var dbType = param.DbType; // Get dbType and value
var val = param.Value; // from
...
// Coerce dbType to a non-null value if val is not null !!!!!
if (dbType == null && val != null) dbType = SqlMapper.LookupDbType(val.GetType(),name);
...
var p = command.CreateParameter();
...
if (dbType != null)
{
p.DbType = dbType.Value;
}
Т.е. он явно вводит IDataParameter.DbType
в значение, которое он ищет своим собственным алгоритмом, вместо того, чтобы оставлять провайдера для использования своих собственных правил.
Есть ли веская причина для этого? Это кажется неправильным для меня, особенно в свете комментария о поддержке Dapper параметров varchar.
Добро пожаловать в переполнение стека! Кодовые ответы не очень полезны сами по себе. Это поможет, если вы можете добавить некоторые детали, объясняющие, как/почему он отвечает на вопрос. – SiHa
Это немного непонятный вопрос, но должен быть достаточным показателем для других, как использовать varchars и хранимые процедуры. – dbol