制作中央SqlConnection的最佳方法

时间:2013-07-24 12:59:47

标签: c# sql sql-server

我想知道制作一个central SqlConnection的最佳方法是什么。因此,当我开始使用C#进行编程时,首先要将SqlConnection这样放入我制作的每个表单中:

public partial class form1 : Form
{
    SqlConnection conn = new SqlConnection(
"Data Source=SERVER\\SQL;Initial Catalog=DataBase;User ID=user;Password=pass");

    public form1 ()
    {
        InitializeComponent();
        timer1.Start();
    }
   }

现在我想建立一个central连接,并在每个表单的开始时删除所有这些代码。

我认为上课是最好的方法。所以我想问你是否有另一种好方法可以做到这一点。

因为我是初学者,请原谅我的描述水平。

感谢您的回答/意见/意见。

5 个答案:

答案 0 :(得分:3)

存储SqlConnection信息的标准方法是使用配置文件,如app.config或web.config。或者,您可以创建自己的配置文件。

之后,使用ConfigurationManager.ConnectionStrings [“YourConnectionStringName”]。ConnectionString而不是硬编码连接设置

答案 1 :(得分:2)

强烈建议不要使用一个“中央”连接,因为它会破坏ADO.NET实现的多个模式。相反,使用“中央连接字符串”要容易得多。如果要使用动态参数,可能需要查看“SqlConnectionStringBuilder”类。

ADO.NET是围绕数据库连接的“aquire late,release early”模式构建的。其他所有尝试迟早会导致大量问题(请相信我,多次看到它:网络错误/事务错误/并发错误/多线程错误......)

ADO.NET使用“连接池”实现与数据库的实际物理连接。因此,除非您为每个连接使用不同的连接字符串,否则最终应该使用一个连接。但是,由于“池”管理那个,它在(重新)打开时将始终处于干净状态。

就个人而言,我喜欢在我的连接字符串中使用类似的东西:

internal static class DataSource
{
    private static string _ConnectionString;
    public static string ConnectionString
    {
        get
        {
            if (_ConnectionString == null)
                _ConnectionString = FunctionToDynamicallyCreateConnectionstring();
            return _ConnectionString;
        }
    }
    private static string FunctionToDynamicallyCreateConnectionstring()
    {
         SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder();
         // initialize cb's properties here...
         return cb.ToString();
    }
}

以后

SqlConnection connection = new SqlConnection(DataSource.ConnectionString);

此模式将确保在我的代码中使用完全相同的连接字符串,并且动态代码仍然只运行一次。

[编辑]在大多数情况下,我避免将整个连接字符串编码到app.config文件中,因为某些参数可能是我的代码必须使用的参数,并且永远不应该被搞乱。我为“服务器”或“数据库”属性创建自定义设置,我读取并分配给ConnectionStringBuilder ...

答案 2 :(得分:1)

没有一个全局连接,因为如果它中断(由于网络错误),您的应用程序将停止工作。此外,您可能会遇到意外打开事务的错误或代码的其他部分不期望的选项集。

相反,全局存储连接字符串并在每次需要时创建一个新连接。最好每次都重新开始。

static class ConnectionFactory
{
 public static SqlConnection Create() {
  return new SqlConnection(GetConnectionStringSomehow());
 }
}

像这样使用:

using (var conn = ConnectionFactory.Create()) {
 //do something
}

答案 3 :(得分:0)

如果你只想要一个全局可访问的sql连接对象,那么只需查看静态类,因为你可以拥有一个带静态构造函数的静态类,所以一切都可以访问它。

我不会这样做,但是如果你在学习它并没有什么坏处,但是静态/单例通常被用来在整个应用程序中拥有一个组件实例。

// Simple static example
public static class DatabaseConnection
{
    public static IDBConnection ActiveConnection {get; private set;}

    static DatabaseConnection()
    {
        var myConnectionString = // get your connection string;
        ActiveConnection = new SqlConnection(myConnectionString);
        ActiveConnection.Connect(); // This is bad, really should be in a using
    }
}

// Simple static usage
DatabaseConnection.ActiveConnection.ExecuteQuery(blah);

问题是你不会控制那个资源,并且在应用程序关闭之前它不会关闭连接,这是不好的做法,所以你可以稍微改进一下,同时保持全局可访问的功能。

// Better static example using actions
public static class DatabaseConnection
{
    private static string connectionString;

    public static void OpenConnectionAnd(Action<Connection> actionToDo)
    {
        using(var connection = new SqlConnection(this.connectionString))
        {
            connection.Connect();
            actionToDo.Invoke(connection);
            connection.Disconnect();
        }       
    }

    static DatabaseConnection()
    {
        this.connectionString = // get your connection string;
    }
}

// Better usage example
DatabaseConnection.OpenConnectionAnd(x => x.Execute(blah));

语法可能不是100%正确,因为我只是在上面写下我的头脑,但应该足够接近有用。

答案 4 :(得分:0)

您可以查看Data Access Pattern来处理与sql的所有接口。

这通常是推荐的方法,因此多个表单(或任何情况)都可以访问检索和存储数据的相同方法。

Here是关于如何使用它的问题(带答案)。