繁体   English   中英

制作中央SqlConnection的最佳方法

[英]Best way to make central SqlConnection

我想知道制作一个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连接,并在每个表单的开始时删除所有这些代码。

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

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

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

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

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

强烈建议不要使用一个“中央”连接,因为它会破坏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 ...

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

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

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

像这样使用它:

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

如果你只想要一个全局可访问的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%正确,因为我只是在上面写下我的头脑,但应该足够接近有用。

您可以查看数据访问模式以处理与sql的所有接口。

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

是一个关于如何使用它的问题(有答案)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM