Пример кода Dapper-Dot-Net

Это код, вырезанный прямо из примеров Dapper:

var p = new DynamicParameters();
p.Add("@a", 11);
p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue); 
cnn.Execute("spMagicProc", p, commandType: commandType.StoredProcedure);
int b = p.Get("@b");
int c = p.Get("@c");

Для всех: в приведенном выше коде из предоставленного примера я получаю сообщение об ошибке "не могу разрешить .Execute" -- ссылаясь на cnn.Execute. Я смотрю на объект подключения, и нет никакого метода для Execute. Dapper, очевидно, работает хорошо, так что же я делаю не так?


person Kevin Earley    schedule 21.09.2012    source источник
comment
cnn это SqlConnection; вам нужна ссылка на сборку SqlConnection и сборку Dapper.net. Что такое окружающий код в вашем примере?   -  person Metro Smurf    schedule 21.09.2012
comment
Спасибо за быстрый ответ Метро. Вот окружающий код. У меня есть ссылки на dapper, а также на SqlClient. Единственная ошибка компиляции, которую я получаю, это для .Execute. (см. следующий пост для кода)   -  person Kevin Earley    schedule 21.09.2012
comment
используя (var connection = new SqlConnection(connectionString)){ try{connection.Open(); //из изящного примера var p = new DynamicParameters(); п.Добавить(@а, 11); p.Add(@b, dbType: DbType.Int32, направление: ParameterDirection.Output); p.Add(@c, dbType: DbType.Int32, направление: ParameterDirection.ReturnValue); connection.Execute(MyDamnStoredProc, p, commandType: commandType.StoredProcedure); int b = p.Get‹int›(@b); int c = p.Get‹int›(@c);   -  person Kevin Earley    schedule 21.09.2012
comment
Можете ли вы опубликовать все исключение? Я вижу 2 вещи, которые могут быть потенциальными проблемами: 1. commandType.StoredProcedure должен быть CommandType.StoredProcedure (обратите внимание на заглавные буквы); 2. Существует ли хранимая процедура в вашей базе данных?   -  person Metro Smurf    schedule 21.09.2012
comment
Я изменил заглавные буквы. Кроме того, это сохраненное имя процедуры. Код и процедура не предназначены для обеспечения качества продукции — просто для справки для всех, у кого есть проблемы. Я просто хочу посмотреть, как работает Даппер. Я не знаю, как показать весь код, не разбивая его на несколько постов, так что вот.   -  person Kevin Earley    schedule 21.09.2012
comment
с помощью системы; используя System.Collections.Generic; используя System.Configuration; используя System.Data; используя System.Data.SqlClient; с помощью SqlMapper;   -  person Kevin Earley    schedule 21.09.2012
comment
общедоступный статический класс Program {общедоступная статическая строка GetOpenConnection () { ConnectionStringSettingsCollection settings = ConfigurationManager.ConnectionStrings; Console.WriteLine(настройки.Количество); if (settings != null) {foreach (ConnectionStringSettings cs в настройках) { Console.WriteLine(cs.Name); Console.WriteLine(cs.ProviderName); Console.WriteLine(cs.GetType()); Console.WriteLine(cs.ConnectionString); Консоль.ЗаписьЛинии(); вернуть cs.ConnectionString; }} Console.WriteLine(Нехорошо. В конфигурационном файле не было строки подключения.); вернуть ноль;}   -  person Kevin Earley    schedule 21.09.2012
comment
public static void Main(){ string connectionString = GetOpenConnection(); //получает действительную строку подключения, используя (var connection = new SqlConnection(connectionString)){ try{//from dapper example var p = new DynamicParameters(); п.Добавить(@а, 11); p.Add(@b, dbType: DbType.Int32, направление: ParameterDirection.Output); p.Add(@c, dbType: DbType.Int32, направление: ParameterDirection.ReturnValue); соединение.Открыть(); connection.Execute(MyDamnStoredProc, p, CommandType.StoredProcedure); int b = p.Get‹int›(@b); int c = p.Get‹int›(@c);} catch (Exception ex){Console.WriteLine(ex.Message);}}}}   -  person Kevin Earley    schedule 21.09.2012
comment
Извините за дерьмовое форматирование, но я могу публиковать только 500+ символов за раз.   -  person Kevin Earley    schedule 21.09.2012
comment
Это полное исключение компиляции: ошибка 2 «System.Data.SqlClient.SqlConnection» не содержит определения для «Execute», и ни один метод расширения «Execute», принимающий первый аргумент типа «System.Data.SqlClient.SqlConnection», не может быть найденным (вам не хватает директивы using или ссылки на сборку?)   -  person Kevin Earley    schedule 21.09.2012
comment
Вы можете отредактировать свой вопрос со всем этим? Это совсем немного для расшифровки...   -  person Metro Smurf    schedule 21.09.2012


Ответы (2)


Я считаю, что это должно вас исправить:

using( var connection = new SqlConnection( connectionString ) )
{
    try
    {
        var p = new DynamicParameters();
        p.Add( "a", 11 );
        p.Add( "b", dbType: DbType.Int32, direction: ParameterDirection.Output );
        p.Add( "c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue );
        connection.Open();
        connection.Execute( "MyDamnStoredProc", p, commandType: CommandType.StoredProcedure );
        int b = p.Get<int>( "b" );
        int c = p.Get<int>( "c" );
    }
    catch( Exception ex )
    {
        Console.WriteLine( ex.Message );
    }
}

Примечания:

  1. параметры не нуждаются в символе @; dapper сделает это за вас.
  2. обязательно используйте именованные параметры; см. обновленный метод connection.Execute, в котором указан параметр commandType:. Вы делаете это, чтобы необязательные параметры можно было опустить при вызове метода.
person Metro Smurf    schedule 21.09.2012
comment
Метро, ​​спасибо за помощь. Я все еще получаю ошибку компиляции, ошибка 1 «System.Data.SqlClient.SqlConnection» не содержит определения для «Execute» и нет метода расширения «Execute», принимающего первый аргумент типа «System.Data.SqlClient.SqlConnection» может быть найден (вам не хватает директивы using или ссылки на сборку?). Это компилируется для вас? если это так, я должен пропустить ссылку или что-то в этом роде. Я использую VS2010 Pro/sp1 и .NET 4.0 со всеми пакетами обновлений. - person Kevin Earley; 21.09.2012
comment
Я немного озадачен этим. Все указывает на то, что Dapper.net не упоминается должным образом. - person Metro Smurf; 21.09.2012
comment
Спасибо Метро. По крайней мере, это отличное место для начала. Я отпишусь, что найду. В очередной раз благодарим за помощь. -Кевин - person Kevin Earley; 22.09.2012
comment
Metro, то, что вы рекомендовали, помогло и помогло мне понять, что в dapper отсутствует блок важного кода (неудачная копия/вставка с моей стороны). Я могу выполнить хранимую процедуру с динамическими параметрами, но не знаю, как получить данные, выбранные процедурой. - person Kevin Earley; 25.09.2012
comment
Кевин, взгляните на этот вопрос: Есть ли способ вызвать хранимую процедуру с помощью dapper dot net?. Если это не поможет, я бы порекомендовал начать новый вопрос о том, как получить результаты Sproc с помощью dapper, поскольку на этот вопрос был дан ответ, re: ошибка была устранена. - person Metro Smurf; 25.09.2012

"не удается разрешить .Execute"

Это может быть связано с тем, что ваш метод расширения отсутствует, вы using Dapper; в верхней части файла.

См. также: http://msdn.microsoft.com/en-us/library/bb308966.aspx#csharp3.0overview_topic3

person Sam Saffron    schedule 24.09.2012