标签: sqlconnection

抛出异常时,确保SQL连接关闭的正确方法是什么?

我经常使用看起来像这样的模式.我想知道这是否正常,或者是否有最佳实践我不在这里申请.

具体来说,我在想; 在抛出异常的情况下,我在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)

.net c# sql sqlconnection

18
推荐指数
3
解决办法
2万
查看次数

如何将ADO.net Entity Framework与现有的SqlConnection一起使用?

  1. 我有一个使用SqlConnection的现有asp.net网站.
  2. 我添加了ADO.net实体框架.
  3. 我已成功连接到数据库并创建了.edmx文件.
  4. 我能够通过Entity Framework连接自动生成的连接字符串.

我想使用我在整个站点中用于Entity Framework连接的现有SqlConnection对象.
我不想为将要使用ADO.net实体框架的一个页面使用第二个数据库连接,并且我不想更改整个站点以使用新的Entity Framework连接字符串.

感谢您的任何帮助,您可以提供.

ado.net entity-framework sqlconnection

18
推荐指数
1
解决办法
2万
查看次数

C#DbConnection强制转换为SqlConnection

我在一个应用程序中找到了这段代码

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.

c# sqlconnection

18
推荐指数
3
解决办法
3万
查看次数

抛出异常时,DataAdapter.Fill()是否会关闭其连接?

我在遗留应用程序中使用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)

.net .net-1.1 ado.net sqlconnection resource-leak

17
推荐指数
1
解决办法
2万
查看次数

.net SqlConnection即使在使用{}内也没有关闭

请帮忙!

背景信息

我有一个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)

.net c# sqlconnection linq-to-sql

16
推荐指数
2
解决办法
1万
查看次数

是否最好将打开的SqlConnection作为参数传递,或者在每个方法中调用一个新的?

如果我要调用的方法/函数需要一个开放的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)

我这样做,所以我:

  • 每个进程只能打开和关闭1个SqlConnection

但是,如此构造我的代码会更好:

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)

我看到以这种方式构造它的优点是:

  • 我不必为每个方法传递额外的参数
  • 如果稍后该方法不再具有SQL命令,则每次都不会调用未使用的参数

我看到的缺点是:

  • 如果myMethod是一个递归方法,那么当它自己调用它将打开另一个SqlConnection,依此类推,等等.
  • 如果btnSubmit正在调用所有需要SqlConnection的多个方法,则每个方法都将打开并关闭新连接.

这样做的最佳方法是什么,哪种方式最常用?

c# sqlconnection

16
推荐指数
2
解决办法
2万
查看次数

C#SQLConnection池

任何人都可以向我简要介绍如何在ADO.Net中进行连接池,我需要连接到3个独立的数据库.其中2个在同一服务器中,另一个在另一个服务器中.

更好的代码片段..

c# sql-server ado.net sqlconnection

15
推荐指数
3
解决办法
9618
查看次数

使用SqlConnection/System.Transactions进行Session-Per-Request

我刚刚开始使用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-server sqlconnection system.transactions dapper

15
推荐指数
1
解决办法
1962
查看次数

为什么我们需要在ConnectionString中设置Min池大小

对于SQL连接池,为什么我们需要设置最小池大小?由于连接将保存在连接池中并重用,为什么我们需要保持最小池大小指定的实时连接?谢谢.

c# connection sqlconnection pool

14
推荐指数
1
解决办法
2万
查看次数

SqlConnection.CacheConnectionStringProperties()的.NET代码中的NullReferenceException

我面临着非常奇怪的问题.鉴于以下代码:

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)

.net c# sqlconnection .net-4.7.2

14
推荐指数
1
解决办法
1046
查看次数