2013-10-14 5 views
10

Я нашел следующий комментарий на 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.

ответ

-1
var param = new { Varchar1 = "", Varchar2 = "" }; 
db.Query("SP", param, commandType:CommandType.StoredProcedure); 
+0

Добро пожаловать в переполнение стека! Кодовые ответы не очень полезны сами по себе. Это поможет, если вы можете добавить некоторые детали, объясняющие, как/почему он отвечает на вопрос. – SiHa

+0

Это немного непонятный вопрос, но должен быть достаточным показателем для других, как использовать varchars и хранимые процедуры. – dbol

0

Этот синтаксис необходим для работы с ODBC.

Вам необходимо определить поле CHAR (30) как DbString в C# для Dapper, а также установить значения длины (30) и ansi (true), чтобы предотвратить использование Dapper в качестве типа text/blob. В противном случае вы, скорее всего, получите сообщение об ошибке: «Недопустимая попытка преобразования текста/типа байта».

Я получал эту ошибку, используя ODBC для подключения к Informix, пока не определил свой параметр как DbString() и не установил значения длины и ansi.

More info here.

Смежные вопросы