2010-11-30 2 views
1

У меня есть приложение ASP.NET MVC, где база данных находится на сервере IBM i-Series. У меня есть разработки приложений близки к завершению, когда я начал получать ошибку The ConnectionString property is invalid. выскакивает:«Свойство ConnectionString недействительно». когда я знаю, что это действительно

  1. только при входе в системе
  2. после первого удачного входа на после восстановления
  3. кто вошел в еще может нормально работать

Также обратите внимание, что эта проблема возникает только для одного проекта в моем решении. В другом проекте используется одна и та же строка соединения и не имеет этой проблемы (скопировано и вставлено на 100%). Я активно работаю над этими проектами, но не дотрагивался до строк соединений и не работал с AccountController и связанными с ними классами моделей после работы в режиме входа.

Я использую Visual Studio 2008 и .NET версии 3.5.

Строка соединения:

<connectionStrings> 
    <add name="IbmIConnectionString" connectionString="DataSource=192.168.50.200;DefaultCollection=QMFILES;Naming=sql;UserID=XXX;Password=XXXX;"/> 
</connectionStrings> 

метод счета Контроллер входа:

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     string fullName = String.Empty; 
     string employeeId = String.Empty; 

     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
       EmployeeLoginModel elm = new EmployeeLoginModel(); 
       elm.GetUserInfo(model.UserName, model.Password, out fullName, out employeeId); 
       // Update the AuthCookie to include the last 4 digits of the SSN. 
       string userDataString = String.Format("{0}|{1}|{2}", model.Password, fullName.Trim(), employeeId.Trim()); 
       HttpCookie authCookie = FormsAuthentication.GetAuthCookie(model.UserName, model.RememberMe); 
       FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value); 
       FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, userDataString); 
       authCookie.Value = FormsAuthentication.Encrypt(newTicket); 
       Response.Cookies.Add(authCookie); 

       if (!String.IsNullOrEmpty(returnUrl)) 
       { 
        return Redirect(returnUrl); 
       } 
       else 
       { 
        return RedirectToAction("Index", "Home"); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("", "The user name or password provided is incorrect."); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

сотрудников Логин Модель:

public class EmployeeLoginModel 
{ 
    public string UserName { set; get; } 
    public string Password { set; get; } 

    private iDB2Connection conn; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="EmployeeLoginModel"/> class. 
    /// </summary> 
    public EmployeeLoginModel() 
    { 
     conn = new iDB2Connection(ConfigurationManager.ConnectionStrings["IbmIConnectionString"].ConnectionString); 
    } 

    /// <summary> 
    /// Determines whether [is valid user] [the specified username]. 
    /// </summary> 
    /// <param name="username">The username.</param> 
    /// <param name="password">The password.</param> 
    /// <returns> 
    ///  <c>true</c> if [is valid user] [the specified username]; otherwise, <c>false</c>. 
    /// </returns> 
    public bool IsValidUser(string username, string password) 
    { 
     int count = 0; 

     // Get the data from the iSeries 
     using (conn) 
     { 
      string sqlStatement = "SELECT COUNT(XXXXX) FROM XXXXX WHERE UPPER(XXXXXX) = @1 AND XXXXXX = @2"; 

      iDB2Command cmd = new iDB2Command(sqlStatement, conn); 
      cmd.CommandType = CommandType.Text; 
      cmd.Parameters.Add("@1", username.ToUpper()); 
      cmd.Parameters.Add("@2", password); 
      conn.Open(); 
      count = (Int32)cmd.ExecuteScalar(); 
      conn.Close(); 
     } 

     return ((count == 0) ? false : true); 
    } 
+1

Подробнее? Может быть, строка подключения, как вы извлекаете строку подключения, как выглядит ваш контроллер учетной записи? Опубликуйте свои журналы SVN тоже, я никогда не верю, что «я его больше не трогал». ;) – jfar 2010-11-30 19:17:02

+1

Кстати, вы уверены, что хотите, чтобы ваш пароль был указан здесь? Если это ваш реальный пароль, я предлагаю немедленно его изменить ... (Просто редактирование сообщения здесь не поможет, потому что люди могут видеть историю изменений.) – Eilon 2010-11-30 19:24:09

ответ

2

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

public bool IsValidUser(string username, string password) 
    { 
     int count = 0; 

     // Get the data from the iSeries 
     using (iDB2Connection conn = new iDB2Connection(ConfigurationManager.ConnectionStrings["IbmIConnectionString"].ConnectionString)) 
     { 
      string sqlStatement = "SELECT COUNT(XXXXXX) FROM XXXXXX WHERE UPPER(XXXXXX) = @1 AND XXXXXX = @2"; 

      iDB2Command cmd = new iDB2Command(sqlStatement, conn); 
      cmd.CommandType = CommandType.Text; 
      cmd.Parameters.Add("@1", username.ToUpper()); 
      cmd.Parameters.Add("@2", password); 
      conn.Open(); 
      count = (Int32)cmd.ExecuteScalar(); 
      conn.Close(); 
     } 

     return ((count == 0) ? false : true); 
    } 

Кажется, что он работает сейчас. Интересно, это была проблема.

1

Я думаю, потому что вы используете соединение вне оператора using, поэтому он будет закрыт после перехода к другой функции, поэтому при вызове IsValidUser он будет генерировать исключение. во втором коде вы используете его в инструкции using, после вызова будет выпущена сборка мусора. И это работа.

1

Другой очень простой причиной для получения этой ошибки является то, что необходимые драйверы DB2 не установлены.

Внутреннее исключение указано

Не удается загрузить DLL «cwbdc.dll»: Указанный модуль не может быть найден. (Исключение из HRESULT: 0x8007007E) Тип: System.DllNotFoundException

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