Фантомная ошибка при подключении к БД - PullRequest
0 голосов
/ 08 марта 2012

У меня есть приложение ASP / C # (4.0), которое работало на моей машине в течение нескольких дней. Внезапно, в середине тестирования я получил эту ошибку. Приложение, похоже, "подождет" небольшой промежуток времени, прежде чем выдать ошибку. Я смог получить доступ к серверу через SQL-Management / Web / RDC / Ping просто отлично. Я попробовал iisreset, переработав пул приложений и запустив / остановив пул приложений. Ничего не избавляло от ошибки, пока я не перезагрузился. Я предполагаю, что это как-то связано с пулом соединений, и я полагаю, что я делаю что-то не так. Эта проблема также коснулась мини-iis, который VS запускает для отладки / и т. Д.

В настоящее время я не могу, чтобы это повторилось, но я действительно ненавижу проблемы, которые "исправляются". Так как это в настоящее время не может быть проверено, я просто ищу направление и некоторые идеи, если оно придет снова.

Спасибо: -)

Информация об исключении: Тип исключения: SqlException Сообщение об исключении: при установлении соединения с SQL Server произошла ошибка сети или экземпляра. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений. (поставщик: поставщик именованных каналов, ошибка: 40 - не удалось открыть соединение с SQL Server) в System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () в System.Data.SqlClient.TdsParser.Connect (ServerInfo serverInfo, SqlInternalConnectionTds connHandler, логическое ignoreSniOpenTimeout, Int64 timerExpire, логическое шифрование, логическое доверие trustServerCert, логическое интегрированное обеспечение безопасности) в System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin (ServerInfo serverInfo, String newPassword, логическое значение ignoreSniOpenTimeout, тайм-аут TimeoutTimer, SqlConnection owningObject) в System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover (ServerInfo serverInfo, String newPassword, логическое значение redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, время ожидания TimeoutTimer) в System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist (SqlConnection owningObject, TimeoutTimer timeout, SqlConnectionString connectionOptions, String newPassword, логический redirectedUserInstance) в System.Data.SqlClient.SqlInternalConnectionTds..ctor (идентификатор DbConnectionPoolIdentity, SqlConnectionString connectionOptions, объект providerInfo, строка newPassword, SqlConnection owningObject, логический redirectedUserInstance) в System.Data.SqlClient.SqlConnectionFactory.CreateConnection (параметры DbConnectionOptions, объект poolGroupProviderInfo, пул DbConnectionPool, DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection (DbConnection owningConnection, пул DbConnectionPool, параметры DbConnectionOptions) в System.Data.ProviderBase.DbConnectionPool.CreateObject (DbConnection owningObject) в System.Data.ProviderBase.DbConnectionPool.UserCreateRequest (DbConnection owningObject) в System.Data.ProviderBase.DbConnectionPool.GetConnection (DbConnection owningObject) в System.Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection externalConnection, DbConnectionFactory connectionFactory) в System.Data.SqlClient.SqlConnection.Open () в MyApp.Default.BeginAsyncGetState (Отправитель объекта, EventArgs e, AsyncCallback cb, Состояние объекта) в C: ... \ Default.aspx.cs: строка 65 в System.Web.UI.Page.PageAsyncInfo.CallHandlersPossblyUnderLock (Boolean onPageThread) в System.Web.UI.Page.PageAsyncInfo.CallHandlersCancellableCallback (состояние объекта) в System.Web.HttpContext.InvokeCancellableCallback (обратный вызов WaitCallback, состояние объекта) at System.Web.UI.Page.PageAsyncInfo.CallHandlers (Boolean onPageThread)

 public partial class Default : System.Web.UI.Page
    {

        SqlCommand _sqlCMD;
        SqlConnection _sqlConn = null;

         protected void Page_Load(object sender, EventArgs e)
        {
            String strStateCode = Request.QueryString["State"] ?? String.Empty;

            if (!Page.IsPostBack || !(Session["vchCurrentStateID"] ?? String.Empty).Equals(strStateCode))
            {
                AddOnPreRenderCompleteAsync(
                            new BeginEventHandler(BeginAsyncGetState),
                            new EndEventHandler(EndAsyncGetState)
                        );
            }
        }

         protected IAsyncResult BeginAsyncGetState(object sender, EventArgs e, AsyncCallback cb, object state)
        {
            String ConString = System.Configuration.ConfigurationManager.ConnectionStrings["ReportServer"].ConnectionString;
            _sqlConn = new SqlConnection(ConString);
            _sqlCMD = new SqlCommand();
            SqlDataReader myReader = null;

            _sqlCMD.Connection = _sqlConn;
            _sqlCMD.CommandType = CommandType.StoredProcedure;

            String strStateCode = Request.QueryString["State"] ?? String.Empty;

            IAsyncResult tmpResult = null;
            try
            {
                _sqlConn.Open();

                _sqlCMD.CommandText = "dbo.StateLevel_gState";
                _sqlCMD.Parameters.AddWithValue("@vchShortCode", strStateCode);

                tmpResult = _sqlCMD.BeginExecuteReader(cb, state);
            }
            catch (Exception ex)
            {
                if (_sqlConn != null)
                    _sqlConn.Close();
                if (_sqlCMD != null)
                    _sqlCMD.Dispose();
                if (myReader != null)
                    myReader.Dispose();

                throw;
            }
            return tmpResult;
        }

        void EndAsyncGetState(IAsyncResult ar)
        {
            try
            {
                using (SqlDataReader myReader = _sqlCMD.EndExecuteReader(ar))
                {
                    if (myReader.Read())
                    {
                        lblStateName.Text = myReader.GetString(1);
                        Session["iCurrentStateID"] = myReader.GetInt32(0);
                        Session["vchCurrentStateID"] = Request.QueryString["State"];
                        Session["vchReportLocation"] = myReader.GetString(3);
                    }
                    else
                    {
                        lblStateName.Text = "Invalid State";
                    }
                }
            }
            finally
            {
                if (_sqlConn != null)
                    _sqlConn.Close();

                if (_sqlCMD != null)
                {
                    _sqlCMD.Dispose();
                }
            }
        }
        }

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Похоже, это проблема именованных каналов, и это может быть изменение сервера базы данных, о котором вы не знаете. Посмотрите на это: http://blog.sqlauthority.com/2009/05/21/sql-server-fix-error-provider-named-pipes-provider-error-40-could-not-open-a-connection-to-sql-server-microsoft-sql-server-error/

Надеюсь, это поможет

0 голосов
/ 28 сентября 2012

Именованные каналы - это последний протокол, который провайдер sql пытается использовать, если он использует несколько протоколов, поэтому у вас может возникнуть проблема с общей аутентификацией. Я видел ошибку, описанную вами, при подключении к серверам с использованием разных учетных записей Windows путем сопоставления дисков или использования «Запуск от имени».

Один прием, который может сработать, - это создать псевдоним для вашего сервера в файле etc / hosts и использовать его в строке подключения. Это помогает предотвратить передачу учетных данных между процессами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...