c#.net中的每个表单都需要与sql数据库建立新的连接吗?

c#.net中的每个表单都需要与sql数据库建立新的连接吗?,sql,winforms,roles,Sql,Winforms,Roles,我正在创建一个使用SQLServer2005Express的c#.net winforms应用程序。我有三张申请表 因此,首先,当显示Form1时,我使用windows身份验证连接到数据库,Form1是主窗体。它使用app.config文件中的连接字符串 然后,我通过单击form1上的按钮来执行sp_setapprole,从而更改为应用程序角色 然后,Form2打开,我希望它使用form1中设置的相同应用程序角色连接到数据库 我该怎么做? 是否每个表单都需要与sql数据库建立新的连接 我已经预先

我正在创建一个使用SQLServer2005Express的c#.net winforms应用程序。我有三张申请表

因此,首先,当显示Form1时,我使用windows身份验证连接到数据库,Form1是主窗体。它使用app.config文件中的连接字符串

然后,我通过单击form1上的按钮来执行sp_setapprole,从而更改为应用程序角色

然后,Form2打开,我希望它使用form1中设置的相同应用程序角色连接到数据库

我该怎么做? 是否每个表单都需要与sql数据库建立新的连接


我已经预先在SQL Server中创建了应用程序角色。

不,我要说的是,一般来说,对于厚(单线程)客户端,您可能只希望打开一个连接(可能在客户端的生命周期内)

您可以保留Form2的无参数构造函数(VS设计器需要此构造函数才能继续工作),但您可以为Form2创建第二个构造函数,该构造函数通过打开的连接并继续使用它,例如:

public Form2()
{
    InitializeComponent();
}
private SqlConnection _conn;
public Form2(SqlConnection conn)
    : this()
{
    _conn = conn;
}

否则(如果您是多线程应用程序),我建议您仅在需要时打开连接,执行工作,然后再次关闭连接。连接池将确保这不会像听起来那样低效,并且尝试在多个线程之间共享单个连接可能会变得非常混乱。如果要执行此操作,您可能希望在SqlConnection上创建一个扩展方法,类似于
OpenAndSetAppRole
,它将打开一个新连接并在返回之前调用sp_setapprole proc作为起点。请看本文: 是使用ADO.NET的最佳实践的集合。关于连接的摘录如下:

使用连接 高性能应用程序可以在最短的时间内保持与数据源的连接,并利用连接池等性能增强技术。以下主题提供了一些技巧,帮助您在使用ADO.NET连接到数据源时获得更高的性能


换句话说,当您发出对话(在网格中填充页面、更新记录等)时,您应该连接到数据库

@Damien_不信者,thanx很多,先生,但我该如何使用它。这是一个错误_找不到conn。您能给我完整的代码吗?在应用程序的整个生命周期中打开连接正是我们不应该做的。@sqlchild-您是否在定义
\u conn
私有成员的第二个构造函数上方添加了一行?我还假设您在Form2的顶部有一个
using System.Data.SqlClient
语句,或者系统会提示您添加一个。为了补充以上内容,我必须知道您如何使用Form2中的连接。@Felice-这比每个表单一个可能在应用程序生命周期内保持活动的连接要好。此外,如果启用了连接池,并且应用程序具有合理的数据密集度,那么该连接实际上将在应用程序的生命周期内保持打开状态。通过保持此显式,您正在保存多个
sp_reset_connection
sp_setapprole
调用。@Felice,那么替换它的是什么,先生,我如何验证我的Form2是否使用了在Form1中设置的应用程序角色。此外,如果我希望form2使用form1中设置的应用程序角色,我是否也必须在form2中与数据库建立新连接。我正在使用form2创建一个新的数据库,方法是单击form2上的按钮。先生,您可以在每笔交易中重复调用。我不明白您的意思