[英]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%正确,因为我只是在上面写下我的头脑,但应该足够接近有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.