数据库连接的幻像错误
我有一台ASP / C#(4.0)应用程序在我的机器上运行了好几天。 突然,在测试中,我得到了这个错误。 在抛出错误之前,该应用似乎“等待”了很短的时间。 我能够通过SQL-Management / Web / RDC / Ping访问服务器。 我试过iisreset,回收应用程序池,并开始/停止应用程序池。 重新启动之前,没有任何东西可以摆脱错误。 我假设它与连接池有关,我认为我做错了什么。 这个问题也影响了VS开始调试/等的迷你iis。
我目前无法再让它发生,但我真的很讨厌那些“修复自己”的问题。 由于目前还无法测试,所以我只是在寻找方向,有些想法让它再次出现。
谢谢 :-)
异常信息:异常类型:SqlException异常消息:建立到SQL Server的连接时发生网络相关或实例特定的错误。 服务器未找到或无法访问。 验证实例名称是否正确,并将SQL Server配置为允许远程连接。 (提供程序:命名管道提供程序,错误:40 - 无法打开连接到SQL Server)在System.Data.SqlClient.SqlInternalConnection.OnError(SqlException异常,布尔breakConnection)在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo,SqlInternalConnectionTds connHandler,Boolean ignoreSniOpenTimeout,Int64 timerExpire,布尔加密,布尔trustServerCert,布尔integratedSecurity)在System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo,字符串newPassword,布尔ignoreSniOpenTimeout ,System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection拥有对象,System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo,String newPassword,Boolean redirectedUserInstance,SqlConnection owningObject,SqlConnectionString connectionOptions,TimeoutTimer超时) TimeoutTim 在System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity身份,SqlConnectionString connectionOptions,对象providerInfo,字符串newPassword,SqlConnection拥有对象,布尔redirectedUserInstance)在System.Data.SqlClient.SqlConnectionFactory上的超时,超时,SqlConnectionString connectionOptions,字符串newPassword,布尔redirectedUserInstance) .CreateConnection(DbConnectionOptions options,Object poolGroupProviderInfo,DbConnectionPool pool,DbConnection owningConnection)at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection,DbConnectionPool pool,DbConnectionOptions options)at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection (对象发件人,EventArgs e,AsyncCallback cb,对象状态)在System.Data.SqlClient.SqlConnection.Open()处的System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory)在C:... Default.aspx.cs中:System.Web.UI.Page.PageAsyncInfo.CallHandlersPossiblyUnderLock(布尔onPageThread)上的第65行System.Web.UI.Page.PageAsyncInfo.CallHandlersCancellableCallback(对象状态)在系统。 Web.HttpContext.InvokeCancellableCallback(WaitCallback回调,对象状态)在System.Web.UI.Page.PageAsyncInfo.CallHandlers(布尔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();
}
}
}
}
看起来像是一个命名管道问题,它可能是您不知道的数据库服务器的变化。 看看这个:http://blog.sqlauthority.com/2009/05/21/sql-server-fix-error-provider-named-pipes-provider-error-40-could-not-open-a-连接到SQL服务器,微软SQL服务器错误/
希望能帮助到你
如果使用多个协议,命名管道是sql提供程序尝试的最后一个协议,因此您可能只是具有一般认证问题。 通过映射驱动器或使用“运行方式”连接到使用不同Windows帐户的服务器时,我已经看到您描述的错误。
一种可能的办法是在etc / hosts文件中为你的服务器创建一个别名,并在连接字符串中使用它。 这有助于保持凭据不被跨进程共享。
链接地址: http://www.djcxy.com/p/56705.html