连接状态问题
我已经发布了我的新网站,在我的计算机中它工作正常并且没有问题,但是在服务器中我当某些用户同时连接时它崩溃了。
我发现这个方法有一个错误:
public static DbDataReader ExecuteReader(DbCommand dbCommand, CommandBehavior commandBehavior)
{
if (dbConnection.State != ConnectionState.Open)
dbConnection.Open();
return dbCommand.ExecuteReader(commandBehavior);
}
当我跟踪它时,它说ConnectionState未打开,并且它正在打开。这是我的问题:
1-如果当 ConnectionState 正在打开时,我们再次打开连接,会出现问题吗?
2-我收到此错误时错过了什么?
编辑
欲了解更多信息,我在这里粘贴了我的代码的一部分:
public class DbProviderHelper
{
private static DbProviderFactory dbProviderFactory;
private static DbConnection dbConnection;
#region dbConnexion
public static DbConnection GetConnection()
{
if (dbConnection == null)
{
ConnectionStringsSection connectionStringsSection = GetConnectionStringsSection();
dbProviderFactory = DbProviderFactories.GetFactory(connectionStringsSection.ConnectionStrings[1].ProviderName);
dbConnection = dbProviderFactory.CreateConnection();
dbConnection.ConnectionString = connectionStringsSection.ConnectionStrings[1].ConnectionString;
}
return dbConnection;
}
public static ConnectionStringsSection GetConnectionStringsSection()
{
return ConfigurationManager.GetSection("connectionStrings") as ConnectionStringsSection;
}
#endregion dbConnexion
#region dbCommand
public static DbCommand CreateCommand(String commandText, CommandType commandType)
{
DbCommand dbCommand = dbProviderFactory.CreateCommand();
dbCommand.Connection = dbConnection;
dbCommand.CommandType = commandType;
dbCommand.CommandText = commandText;
return dbCommand;
}
#endregion dbCommand
#region dbParameter
public static DbParameter CreateParameter(string parameterName, DbType dbType, object value)
{
DbParameter oDbParameter = dbProviderFactory.CreateParameter();
oDbParameter.ParameterName = parameterName;
oDbParameter.DbType = dbType;
oDbParameter.Value = value;
return oDbParameter;
}
#endregion dbParameter
#region Operations
public static DbDataReader ExecuteReader(DbCommand dbCommand)
{
if (dbConnection.State != ConnectionState.Open)
dbConnection.Open();
return dbCommand.ExecuteReader(CommandBehavior.CloseConnection);
}
public static int ExecuteNonQuery(DbCommand dbCommand)
{
try
{
if (dbConnection.State != ConnectionState.Open)
dbConnection.Open();
return dbCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
dbConnection.Close();
}
}
#endregion Operations
}
并且我投票如下:
public class Configuration
{
public Configuration()
{
DbProviderHelper.GetConnection();
}
public DbDataReader GetTabsParent(int tabId)
{
DbCommand oDbCommand = DbProviderHelper.CreateCommand("Portal_TabsGetParent", CommandType.StoredProcedure);
oDbCommand.Parameters.Add(DbProviderHelper.CreateParameter("@TabID", DbType.Int32, tabId));
DbDataReader oDbDataReader = DbProviderHelper.ExecuteReader(oDbCommand);
return oDbDataReader;
}
}
I've published my new website , In my computer it works fine and no problem , But in the Server I when some user connect at the same time it crash .
I found out There is a error at this Method :
public static DbDataReader ExecuteReader(DbCommand dbCommand, CommandBehavior commandBehavior)
{
if (dbConnection.State != ConnectionState.Open)
dbConnection.Open();
return dbCommand.ExecuteReader(commandBehavior);
}
When i trace it , It says ConnectionState is not open , and it's doing opening . Here are my questions :
1- Is it a problem if while ConnectionState is doing opening , we Open the connection again ?
2- What I've missed , that i receive this error ?
Edit
For more information I past some part of my code here :
public class DbProviderHelper
{
private static DbProviderFactory dbProviderFactory;
private static DbConnection dbConnection;
#region dbConnexion
public static DbConnection GetConnection()
{
if (dbConnection == null)
{
ConnectionStringsSection connectionStringsSection = GetConnectionStringsSection();
dbProviderFactory = DbProviderFactories.GetFactory(connectionStringsSection.ConnectionStrings[1].ProviderName);
dbConnection = dbProviderFactory.CreateConnection();
dbConnection.ConnectionString = connectionStringsSection.ConnectionStrings[1].ConnectionString;
}
return dbConnection;
}
public static ConnectionStringsSection GetConnectionStringsSection()
{
return ConfigurationManager.GetSection("connectionStrings") as ConnectionStringsSection;
}
#endregion dbConnexion
#region dbCommand
public static DbCommand CreateCommand(String commandText, CommandType commandType)
{
DbCommand dbCommand = dbProviderFactory.CreateCommand();
dbCommand.Connection = dbConnection;
dbCommand.CommandType = commandType;
dbCommand.CommandText = commandText;
return dbCommand;
}
#endregion dbCommand
#region dbParameter
public static DbParameter CreateParameter(string parameterName, DbType dbType, object value)
{
DbParameter oDbParameter = dbProviderFactory.CreateParameter();
oDbParameter.ParameterName = parameterName;
oDbParameter.DbType = dbType;
oDbParameter.Value = value;
return oDbParameter;
}
#endregion dbParameter
#region Operations
public static DbDataReader ExecuteReader(DbCommand dbCommand)
{
if (dbConnection.State != ConnectionState.Open)
dbConnection.Open();
return dbCommand.ExecuteReader(CommandBehavior.CloseConnection);
}
public static int ExecuteNonQuery(DbCommand dbCommand)
{
try
{
if (dbConnection.State != ConnectionState.Open)
dbConnection.Open();
return dbCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
dbConnection.Close();
}
}
#endregion Operations
}
And i invote that like :
public class Configuration
{
public Configuration()
{
DbProviderHelper.GetConnection();
}
public DbDataReader GetTabsParent(int tabId)
{
DbCommand oDbCommand = DbProviderHelper.CreateCommand("Portal_TabsGetParent", CommandType.StoredProcedure);
oDbCommand.Parameters.Add(DbProviderHelper.CreateParameter("@TabID", DbType.Int32, tabId));
DbDataReader oDbDataReader = DbProviderHelper.ExecuteReader(oDbCommand);
return oDbDataReader;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的,它可以抛出异常。
直接来自 MSDN:SqlConnection.Open 方法
(您是否使用单个共享连接在不同线程上执行该方法?)
Yes, it can throw an exception.
Straight from MSDN: SqlConnection.Open method
(are you executing the method on different threads with a single shared connection?)