«Свойство ConnectionString недопустимо.»когда я знаю, что это действительно - PullRequest
2 голосов
/ 30 ноября 2010

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

  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);
    }

Ответы [ 3 ]

3 голосов
/ 13 января 2017

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

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

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

2 голосов
/ 30 ноября 2010

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

    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 голос
/ 01 декабря 2010

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

...