我看到一些错误表明"连接泄漏".也就是说,没有正确关闭的连接和池正在耗尽.那么,我该如何进行检测以确定在给定时间内确切打开了多少?
我有一个方法("GetDataReader,"让我们称之为)返回一个SqlDataReader.它位于Singleton DataFactory类中,用于维护与数据库的持久连接.
这样做的问题是,在返回之后,DataReader仍然"连接"到我的DataFactory中的Connection对象.所以,我必须确保调用GetDataReader的代码然后在返回的DataReader上调用Close(),否则,它将"锁定"Connection:
已经有一个与此命令关联的打开DataReader,必须先关闭它.
在从GetDataReader发回DataReader之前,如何"分离"DataReader?要么是,要么克隆它并发回克隆?我不想让调用代码总是明确地关闭它.
这里必须有一个最好的做法.
更新:
谢谢各位的意见.最重要的是,我需要失去使用DataReaders并切换到DataTables的习惯.它们更易于管理.
另外,感谢有关连接池的说明.我知道它,但只是没有把两个和两个放在一起,并意识到我正在重新发明轮子.
如何在执行.Net应用程序期间始终保持SqlConnection(或使用其他组件)打开(连接)?
我需要这个,因为我的应用程序需要使用此commnad进行检测
exec sp_who2
Run Code Online (Sandbox Code Playgroud)
我的应用程序的多少个实例连接到mydatabase,以限制访问(许可证控制).
例
A)我的应用程序从location1执行
exec sp_who2 B)我的应用程序从location2执行
exec sp_who2 对不起我的英语不好.
提前致谢.
我有多个线程访问同一个数据库(具有相同的连接字符串).每个帖子:
使用下面的代码在需要时打开它自己的连接实例
try
{
wasOpened = connection.State == ConnectionState.Open;
if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
}
catch (Exception ex)
{
throw new Exception(string.Format("Connection to data source {0} can not be established! Reason: {1} - complete stack {2}",
connection.Database, ex.Message, ex.StackTrace == null ? "NULL" : ex.StackTrace.ToString()));
}
Run Code Online (Sandbox Code Playgroud)到目前为止,我们已在2台服务器上测试了此代码,并且有一台服务器有时会在SqlConnection.Open方法中抛出异常.这是我们从catch块获得的异常消息:
无法建立与数据源xyz的连接!原因:操作无效.连接已关闭. - 完整的堆栈
在System.Data.SqlClient.SqlConnection.OpenConnection()
处于System.Data.SqlClient.SqlConnection.OpenConnection()
处于System.Data.SqlClient.SqlConnection.Open()
检查SqlConnection.GetOpenConnection方法显示innerConnection为null:
internal SqlInternalConnection GetOpenConnection()
{
SqlInternalConnection innerConnection = this.InnerConnection as SqlInternalConnection;
if (innerConnection == null)
{
throw ADP.ClosedConnectionError();
}
return innerConnection;
} …Run Code Online (Sandbox Code Playgroud) 我指的是很久很久以前发布在Stack Overflow上的帖子. 结束使用关闭打开的SQL连接
但是我有一个问题.我发现在SQL 2012 Express Edition和SQL 2008 Developer Edition上使用不会完全关闭连接.
这是我用过的代码.代码将遍历每个数据库并查找指定的特定表,但是,当它完成后,并且在服务器上运行sp_who时,所有连接仍然存在.状态为休眠状态,cmd为"AWAITING COMMAND",但是当您尝试创建数据库时,无法锁定模型,因为您仍然可以打开连接.这是班里的一个错误吗?
using (SqlConnection conn = new SqlConnection("Data Source=" + ServerNameCombo.Text + ";Initial Catalog=master;Persist Security Info=True;User ID=" + UserNameEdit.Text + ";Password=" + PasswordEdit.Text))
{
using (SqlCommand dbs = new SqlCommand("Select name from sysdatabases", conn))
{
conn.Open();
using (SqlDataReader reader = dbs.ExecuteReader())
{
while (reader.Read())
{
using (SqlConnection dbconn = new SqlConnection("Data Source=" + ServerNameCombo.Text + ";Initial Catalog=" + reader["name"].ToString() + ";Persist Security Info=True;User ID=" + UserNameEdit.Text + ";Password=" + PasswordEdit.Text)) …Run Code Online (Sandbox Code Playgroud) 在我的应用程序上,我需要连接客户端数据库(SqlServer),看看我们是否可以连接.这些是来自web.config的连接字符串(值不是这样,我更改了ip,user和pwd)
<add name="ConnectionStringLibracom" connectionString="Data Source=192.168.1.45\SqlServer2008;Initial Catalog=xxx;user=xxx;pwd=xxx;Application Name=MES"
providerName="System.Data.SqlClient" /> (MINE)
<add name="ConnectionStringMigplus" connectionString="Data Source=999.99.999.99;Initial Catalog=xxx;user=xxx;pwd=xxx"
providerName="System.Data.SqlClient" /> (CLIENT)
Run Code Online (Sandbox Code Playgroud)
但这段代码挂起了我的整个应用程序(当我说它挂起时,我的意思是它不允许我的应用程序连接到我们的数据库).我在Load事件的Default.aspx上执行它:
protected void Page_Load(object sender, EventArgs e)
{
if (!TestaIntegracaoErpMigplus())
{
lblMensagemIntegracao.Visible = true;
Session["Integracao"] = false;
}
else
Session["Integracao"] = true;
}
protected static bool TestaIntegracaoErpMigplus()
{
string connectionStringMigplus = WebConfigurationManager.ConnectionStrings["ConnectionStringMigplus"].ConnectionString;
bool ret = false;
using (SqlConnection Conn = new SqlConnection(connectionStringMigplus))
{
try
{
Conn.Open();
if (Conn.State == ConnectionState.Open)
{
ret = true;
}
}
catch (SqlException)
{
ret = false; …Run Code Online (Sandbox Code Playgroud) 在开发Windows应用程序时:
如何在连接字符串中保护用户名和密码?
像银行这样的组织,是否会将数据库的用户名和密码提供给应用程序开发人员?如果不是通常的话,那些应用程序开发人员如何编写数据库连接?
在连接字符串中保护用户和密码的行业标准是什么?
谢谢
使用 dapper 的 QueryAsync 方法时,使用 connection.OpenAsync() 和 connection.Open() 有什么区别。
异步:
public async Task<IList<Product>> GetListAsync()
{
using (var connection = new SqlConnection(_connectionString))
{
StringBuilder sql = new StringBuilder();
sql.AppendLine("SELECT Id, Name ");
sql.AppendLine("FROM Product ");
await connection.OpenAsync();
var tickets = await connection.QueryAsync<Ticket>(sql.ToString());
return tickets.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
非异步:
public async Task<IList<Product>> GetListAsync()
{
using (var connection = new SqlConnection(_connectionString))
{
StringBuilder sql = new StringBuilder();
sql.AppendLine("SELECT Id, Name ");
sql.AppendLine("FROM Product ");
connection.Open();
var tickets = await connection.QueryAsync<Ticket>(sql.ToString());
return tickets.ToList();
}
}
Run Code Online (Sandbox Code Playgroud) 使用SQLCommand/ SQLConnection而不是OleDbCommand/ 是否有所不同OleDbConnection.从API舒适性,功能,性能或安全性角度来看,我是否从中获得了任何优势?还是其他任何观点?
有谁知道是否System.Data.SqlClient.SqlConnection有自己的实现来访问SQL Server?或者它是否使用以下客户端之一:
SQLOLEDB)(已弃用)SQLNCLI)(已弃用)MSOLEDBSQL)sqlconnection ×10
c# ×8
ado.net ×5
sql-server ×5
.net ×3
asp.net ×2
dapper ×1
database ×1
oledb ×1
winforms ×1