2014-11-08 2 views
0

Я использую Microsoft.Practices.EnterpriseLibrary для доступа к базе данных SQL Server в своем C# -коде. У меня есть метод, который вызывает хранимую процедуру и отправляет параметр в хранимую процедуру, и эта хранимая процедура возвращает строку (имя пользователя и пароль).Возвращаемое значение в методе, вызывающем хранимую процедуру

Я не уверен, как вернуть значение в этом методе.

Это мой код:

public Model.Login GetUsernameandPasswordByPartnerID(int partnerId) 
{ 
     Model.Login login; 

     string myConnection = System.Configuration.ConfigurationManager.ConnectionStrings[connectionName].ToString(); 
     SqlDatabase db = new SqlDatabase(myConnection); 

     using (DbCommand command = db.GetStoredProcCommand("AS_AuthenticateByPartner")) 
     { 
      db.AddInParameter(command, "partnerID", DbType.String, partnerId); 

      try 
      { 
       login = db.ExecuteScalar(command); //error on this line 

       // rtn = Message("Success", "Acquisition", "GetLogin", "Service", db.ExecuteScalar(command).ToString()); 
      } 
      catch (Exception ex) 
      { 
      } 

      db = null; 
      return login; 
     } 
    } 

и мой Model.login

public class Login 
{ 
    public string username; 
    public string password; 
} 

Я не знаю, как должна быть эта строка:

login= db.ExecuteScalar(command); 

теперь я получаю сообщение об ошибке так как вы не можете явно преобразовать объект в Model.login.

ответ

0

Эта ошибка возникает из-за того, что объект возвращает следующую инструкцию.

login= db.ExecuteScalar(command); 

Вы должны сделать что-то вроде этого

login= (Model.Login)db.ExecuteScalar(command); 

Но это не решает проблему, как ExecuteScalar не возвращает .net типа Login. Это полезно, если вы возвращаете int, string и т. Д. Из SQL Server. Чтобы помочь в этом, мне нужно знать, что такое возврат из хранимой процедуры.

Если я предполагаю, что вы возвращаете что-то вроде этого

select username,password from tblUser 

Тогда вы не можете использовать ExecuteScalar как это использовать только для возврата одного значения.

Вы должны сделать что-то вроде этого.

Model.Login model = null; 
var result = db.ExecuteReader(); 
if (!reader.HasRows) 
    model = null; 
else 
    { 
     reader.Read(); 
     model = new Model.Login(){ UserName = reader.GetString(0) , Password= reader.GetString(1) }; 
    } 
+0

спасибо, что оно сработало отлично. – Alma

+0

Если вы хотите получить данные как объекты с помощью Enterprise Library, вам следует рассмотреть возможность использования устройств доступа к данным. См. [Извлечение данных как объектов] (http://msdn.microsoft.com/en-us/library/ff664742 (v = pandp.50) .aspx) для описания (это для версии 5, но в равной степени применимо к версии 6) , –

0

Метод ExecuteScalar обычно используется для возврата одного значения из базы данных.

Попробуйте это вместо этого. Я предполагаю, что хранимая процедура вернет не более единственную запись с совпадающим именем пользователя и паролем.

using (var command = db.GetStoredProcCommand("AS_AuthenticateByPartner")) 
{ 
    db.CommandType = CommandType.StoredProcedure; 

    db.AddInParameter(command, "partnerID", DbType.String, partnerId); 

    // make sure myConnection is open before querying the database 

    var reader = db.ExecuteReader(); 

    if (!reader.HasRows) 
     return null; // no records found... return null? display error? 

    reader.Read(); 

    return new Login {username = reader.GetString(0), password = reader.GetString(1)}; 
} 

Этот код указывает, что текст команды является хранимой процедурой. И он использует ExecuteReader() для возврата (потенциально) нескольких записей из базы данных в результате запроса.

Кроме того, FWIW, не используйте пустые catch блоков. Безмолвное употребление исключений никогда не бывает хорошим ... что-то может пойти не так, и вы никогда не узнаете об этом.

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