我正在使用c#中的windows服务,如果可以,我可能会在我的Web应用程序中使用相同的方法。主要服务是使用自己使用的sqlconnection,使用ConfigurationManager从app.config检索,并创建几个不同类型的线程,以运行多个任务。每个线程都有自己的连接(存储在类属性中)。
public partial class MainService : ServiceBase{
private static string SQLConnStr;
protected static SqlConnection SQLConn;
}
class OtherClass{
private sqlconnection sqlconn;
private string connstr;
}
我坚持的部分是,当我创建另一个对象类型时,我需要该对象能够使用OtherClass连接访问数据库。此新对象在OtherClass中创建并调用,以便稍后进行处理。
是否可以从OtherClass重新使用sql连接? 将sql连接字符串设置为公共静态是否安全可靠? 我使用的设计不是很好吗?
答案 0 :(得分:2)
将其传递给OtherClass
构造函数?
示例详情:
public partial class MainService : ServiceBase{
private string SQLConnStr;
}
class OtherClass{
private string connstr;
public OtherClass(string _connstr) { this.connstr = _connstr; }
public foo() { using(var conn = new SqlConnection(connstr) { ... } }
}
每次创建new SqlConnection
都可以在.NET中使用,因为有连接池。
答案 1 :(得分:1)
您应该使用相应的配置机制。对于应用程序/ Windows服务,这将是app.config
文件,对于Web应用程序,它将是web.config
文件,对于DLL,应将设置从DLL的app.config
复制到应用程序的{ {1}}如此处所描述的多次(DLL不读取其配置文件,因此设置需要进入应用程序的配置文件)。
话虽如此:使用Visual Studio中的设置设计器简单地添加新的连接字符串设置。如有必要,也可以将其添加到其他项目中。
要使用同一项目中类的连接字符串,您只需使用app.config/web.config
,假设该设置名为Settings.Default.MyConnectionString
。
DLL的另一个例外:某些DLL不需要自己的设置,但需要访问数据库。在这种情况下,您可以将连接字符串甚至MyConnectionString
传递给需要数据库访问的函数。
答案 2 :(得分:1)
connection * string *和连接本身之间存在区别。对于connectionstring(描述你应该连接到的位置),你可以将它存储在一个配置文件中,这样你就可以轻松地改变它。
必须打开和关闭用于与数据库通信的连接本身。使用数据加载器时,通常不能对同时执行的命令使用相同的连接。 最好尽可能晚地打开新连接并尽快关闭它。让内置连接池来优化实际连接。
答案 3 :(得分:-1)
我喜欢你的答案,但在看了一段时间之后,我的设计很糟糕。所以我决定在MainService中创建一个公共静态查询函数:
public static void qQuery(string querystr){
using(sqlconnection conn = new sqlconnection(sqlconnstr){
.....
}
}
sqlconnstr是MainService中的私有字符串,在服务启动时初始化。
我希望这是安全可靠的方式......