5

我想知道制作一个的最佳方法是什么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联系并在每种形式的开头摆脱所有这些代码。

我认为那节课是最好的方法。所以我想问你是否有另一种好的方法来制作它。

由于我是初学者,请原谅我的描述水平。

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

4

5 回答 5

3

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

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

于 2013-07-24T13:02:49.180 回答
2

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

ADO.NET 是围绕数据库连接的“获取晚,早发布”模式构建的。其他所有尝试迟早都会导致大量问题(相信我,见过很多次:网络错误/事务错误/并发错误/多线程错误......)

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 的“服务器”或“数据库”属性创建自定义设置...

于 2013-07-27T13:15:48.953 回答
1

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

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

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

像这样使用它:

using (var conn = ConnectionFactory.Create()) {
 //do something
}
于 2013-07-24T13:08:39.453 回答
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% 正确,因为我只是在脑海中写下上面的内容,但应该足够接近才能使用。

于 2013-07-24T13:04:28.897 回答
0

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

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

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

于 2013-07-24T13:04:51.923 回答