我经常使用看起来像这样的模式.我想知道这是否正常,或者是否有最佳实践我不在这里申请.
具体来说,我在想; 在抛出异常的情况下,我在finally块中的代码足以确保连接被正确关闭?
public class SomeDataClass : IDisposable
{
private SqlConnection _conn;
//constructors and methods
private DoSomethingWithTheSqlConnection()
{
//some code excluded for brevity
try
{
using (SqlCommand cmd = new SqlCommand(SqlQuery.CountSomething, _SqlConnection))
{
_SqlConnection.Open();
countOfSomething = Convert.ToInt32(cmd.ExecuteScalar());
}
}
finally
{
//is this the best way?
if (_SqlConnection.State == ConnectionState.Closed)
_SqlConnection.Close();
}
//some code excluded for brevity
}
public Dispose()
{
_conn.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud) 我想使用我在整个站点中用于Entity Framework连接的现有SqlConnection对象.
我不想为将要使用ADO.net实体框架的一个页面使用第二个数据库连接,并且我不想更改整个站点以使用新的Entity Framework连接字符串.
感谢您的任何帮助,您可以提供.
我在一个应用程序中找到了这段代码
Database database = DatabaseFactory.CreateDatabase("connection string");
DbConnection connection = database.CreateConnection();
connection.Open();
SqlConnection sqlConnection = (SqlConnection)connection;
Run Code Online (Sandbox Code Playgroud)
是否安全,SqlConnection从DbConnection中解脱出来.数据库来自Microsoft.Practices.EnterpriseLibrary.Data.根据文档,CreteDatabase返回DbConnection.
我在遗留应用程序中使用ADO.NET(.NET 1.1).我知道DataAdapter.Fill()如果在给DataAdapter之前没有手动打开连接,则会打开和关闭连接.
我的问题:如果.Fill()导致异常,它是否也会关闭连接?(由于无法访问SQL Server,或者其他).它是否泄漏连接或是否具有内置的Finally子句以确保连接正在关闭.
代码示例:
Dim cmd As New SqlCommand
Dim da As New SqlDataAdapter
Dim ds As New DataSet
cmd.Connection = New SqlConnection(strConnection)
cmd.CommandText = strSQL
da.SelectCommand = cmd
da.Fill(ds)
Run Code Online (Sandbox Code Playgroud) 请帮忙!
背景信息
我有一个WPF应用程序访问SQL Server 2005数据库.数据库在运行应用程序的计算机上本地运行.
无处不在我使用Linq DataContext我使用了一个using {}语句,并传入一个函数的结果,该函数返回一个已打开的SqlConnection对象,并在返回DataContext构造函数之前使用它执行了SqlCommand ..即
// In the application code
using (DataContext db = new DataContext(GetConnection()))
{
... Code
}
Run Code Online (Sandbox Code Playgroud)
getConnection看起来像这样(我从函数中删除了'fluff'以使其更具可读性,但没有其他功能缺失).
// Function which gets an opened connection which is given back to the DataContext constructor
public static System.Data.SqlClient.SqlConnection GetConnection()
{
System.Data.SqlClient.SqlConnection Conn = new System.Data.SqlClient.SqlConnection(/* The connection string */);
if ( Conn != null )
{
try
{
Conn.Open();
}
catch (System.Data.SqlClient.SqlException SDSCSEx)
{
/* Error Handling */
}
using (System.Data.SqlClient.SqlCommand SetCmd = new System.Data.SqlClient.SqlCommand()) …Run Code Online (Sandbox Code Playgroud) 如果我要调用的方法/函数需要一个开放的SqlConnection,我将在调用该函数的方法中打开它.例如:
protected static void btnSubmit(){
conn.Open();
myMethod(someParam, conn);
conn.Close();
}
protected static void myMethod(object someParam, SqlConnection conn){
//Some SQL commands etc here..
}
Run Code Online (Sandbox Code Playgroud)
我这样做,所以我:
但是,如此构造我的代码会更好:
protected static void btnSubmit(){
myMethod(someParam);
}
protected static void myMethod(object someParam){
SqlConnection conn = New SqlConnection(".....");
conn.Open();
//Some SQL commands etc here..
conn.Close();
}
Run Code Online (Sandbox Code Playgroud)
我看到以这种方式构造它的优点是:
我看到的缺点是:
myMethod是一个递归方法,那么当它自己调用它将打开另一个SqlConnection,依此类推,等等.btnSubmit正在调用所有需要SqlConnection的多个方法,则每个方法都将打开并关闭新连接.这样做的最佳方法是什么,哪种方式最常用?
任何人都可以向我简要介绍如何在ADO.Net中进行连接池,我需要连接到3个独立的数据库.其中2个在同一服务器中,另一个在另一个服务器中.
更好的代码片段..
我刚刚开始使用Dapper进行一个项目,过去几年大多使用像NHibernate和EF这样的ORM.
通常在我们的Web应用程序中,我们按请求实现会话,在请求开始时开始事务并在结束时提交它.
我们应该在直接使用SqlConnection/System.Transactions时做类似的事情吗?
StackOverflow如何做到这一点?
根据@gbn和@Sam Safron的建议,我没有使用交易.在我的情况下,我只是在进行读取查询,因此似乎没有真正的要求使用事务(与我所知道的隐式事务相反).
我创建了一个轻量级的会话接口,以便每个请求都可以使用一个连接.这对我来说非常有益,因为对于Dapper我经常需要创建一些不同的查询来构建一个对象,而宁愿共享相同的连接.
确定每个请求的连接并处理它的工作是由我的IoC容器(StructureMap)完成的:
public interface ISession : IDisposable {
IDbConnection Connection { get; }
}
public class DbSession : ISession {
private static readonly object @lock = new object();
private readonly ILogger logger;
private readonly string connectionString;
private IDbConnection cn;
public DbSession(string connectionString, ILogger logger) {
this.connectionString = connectionString;
this.logger = logger;
}
public IDbConnection Connection { get { return GetConnection(); } }
private IDbConnection GetConnection() {
if (cn == null) {
lock (@lock) …Run Code Online (Sandbox Code Playgroud) 对于SQL连接池,为什么我们需要设置最小池大小?由于连接将保存在连接池中并重用,为什么我们需要保持最小池大小指定的实时连接?谢谢.
我面临着非常奇怪的问题.鉴于以下代码:
static void Main()
{
var c = new System.Data.SqlClient.SqlConnection();
c.ConnectionString = "Data Source=SOME_NAME;Initial Catalog=SOME_DB;Integrated Security=True";
c.ConnectionString = ""; //null also triggers exception
Console.WriteLine("Success");
}
Run Code Online (Sandbox Code Playgroud)
它运行良好很长一段时间,但在最新版本的Windows 10(1803)上有.NET版本4.7.03056版本461808(似乎是4.7.2)它崩溃了以下异常:
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
at System.Data.SqlClient.SqlConnection.CacheConnectionStringProperties()
at System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
at TestCacheConnectionStringProperties.Program.Main()
Run Code Online (Sandbox Code Playgroud)
这会在第二个任务中崩溃,如果我删除它的任何分配ConnectionString工作正常.
我查看了源代码并没有找到NullReferenceException可能发生的地方(但是.NET Framework 4.7.1似乎是源代码因此可能会改变).
现在问题是 - 导致这个问题的原因是什么?这是一个.NET错误吗?如果是 - 如何解决?
更新:根据评论 - 非常感谢伙计们 - 问题是由这些线引起的(反编译):
private void CacheConnectionStringProperties()
{
SqlConnectionString connectionOptions = this.ConnectionOptions as SqlConnectionString;
if (connectionOptions != …Run Code Online (Sandbox Code Playgroud) sqlconnection ×10
c# ×7
.net ×4
ado.net ×3
sql-server ×2
.net-1.1 ×1
.net-4.7.2 ×1
connection ×1
dapper ×1
linq-to-sql ×1
pool ×1
sql ×1