我的程序C/S多窗体,第一个窗体是MDI容器。如果全程序只用一个SqlConnection对象,是不是要用静态SqlConnection,那么具体应该怎么做?这个静态SqlConnection对象是不是第一个窗体对象的成员,还有何时何地初始化、open、close呢?

解决方案 »

  1.   

    不必用静态
    主窗体的成员
    主窗体装载时初始化、open
    主窗体关闭时close
      

  2.   

    自己做个通讯类,把数据库操作封装进去就好了.一个SqlConnection就可以,不用static的
      

  3.   

    CS程序这方面要求不是很高,毕竟没有同时多用户使用一个Connection的情况
    怎样都是可以的,要注意的是,打开与关闭要对应
    也可以用一个单独的类来封装数据库操作
      

  4.   

    不必用静态
    主窗体的成员
    主窗体装载时初始化、open
    主窗体关闭时close==========================我不建议用长连接的.最好操作数据库前Open,操作完毕Close比较好
      

  5.   

    viena:我在主窗体类中加入了SqlConnection成员,可不管我把这个成员定义为public还是private,其它窗体都无法使用。
      

  6.   

    //我不建议用长连接的.最好操作数据库前Open,操作完毕Close比较好
    你说的那种情况适用于B/S与三层结构的C/S(数据库在操作封装在中间层)
    两层的C/S(客户端直连数据库的)用长连接比较好to 楼主:
    怎么无法使用?
      

  7.   

    定义为public就可以了通过"主窗体实例对象名.变量名"就可使用
      

  8.   

    viena:我这样用,系统报错,您帮我看一下哪有问题?
    主窗体:
    ...
    public SqlConnection sqlConSmoow;
    ...
    public formMain()
    {
    InitializeComponent();
    this.sqlConSmoow = new SqlConnection();
    this.sqlConSmoow.ConnectionString = "workstation id=ZQB;packet size=4096;integrated security=SSPI;data source=localhost;persist security info=False;initial catalog=SMOOW";
    this.sqlConSmoow.Open();
    }
    ...
    static void Main() 
    {
    formMain formmain = new formMain();
    Application.Run(formmain);
    }
    ...其它窗体中调用formmain.sqlConSmoow不行
      

  9.   

    是否没有
    using System.Data.SqlClient连接打开代码不要放在构造函数里,可以放在比如
    formMain_Load里面
      

  10.   

    连接关闭代码放在formMain_Closed里面
      

  11.   

    参考微软的Enterprise Library.
      

  12.   

    配置文件里
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <appSettings>
    <add key = "workstation id=ZQB;packet size=4096;integrated security=SSPI;data source=localhost;persist security info=False;initial catalog=SMOOW " /></appSettings>
    </configuration>程序里 建议用MS的 sqlhelper加一句
    public static string ConnectionString = Configuration.ConfigurationManager.AppSettings["Strsqlconn"];要用的时候直接调用方法就可以了 比如返回个datesetDataset ds = new Dataset() ;
    ds  = ExecuteDataset("select * from xxx");
      

  13.   

    viena:报错信息:找不到类型或命名空间名称“formmain”(是否缺少 using 指令或程序集引用?)。我已经加上using System.Data.SqlClientsunlumail:谢谢,思路开阔了不少,MS的sqlhelper是什么,MSDN里没有
      

  14.   

    TO:viena(维也纳nn木人 [IQ=50,EQ<0]) ( ) 信誉:100 
    c/s结构用长连接比较好
    -----------------------------------------------------------
    c/s结构的真的用长连接比较好吗?
    要是数据库是连的远程的呢
    所有的客户端都连远程的同一个数据库!这样也用长连接比较好?
    值得怀疑!
      

  15.   

    为什么要只用一个SqlConnection,
    我经常的做法是设置一个静态的全局ConnectionString,局部NEW 一个SqlConnection,用时打开,用完就关闭,这样有什么不好吗?
      

  16.   

    如果真要保证只有一个连接的话 很简单阿,你只要采用signalton模式就可以了
    比方你再formMain可以这么定义:
    public class formMain
    {
          private System.Data.SqlConnection sqlConnection = null;
          public formMain()
          {
              InitializeComponent();
              
              OpenSqlConnection();
          }
          public void OpenSqlConnection() // 这里初始化连接对象
          {
              sqlConnection = new System.Data.SqlConnection();
              sqlConnection.ConnectionString = "详细信息";
              sqlConnection.Open();
          }
          public static System.Data.SqlConnection GetSQLConnection()//这里取得有效连接
          {
               if(sqlConnection == null)//如果没有联接的话,建立连接
               {
                   OpenSqlConnection();
               }
               else
               {
                  return sqlConnection;
                }
          }
    }
    然后你在窗口的Closed事件中写上关闭连接的事件。
    你其他窗口就可以同各formMain.GetSQLConnection();这样的形式取得当前的连接了。关于SignalTon模式可以查看其他的书。
      

  17.   

    SqlHelper MS专门推荐操作SQL数据库的类
      

  18.   

    SqlHelper MS专门推荐操作SQL数据库的类
      

  19.   

    楼主不会是在其他窗体重新new出主窗体的对象吧?
    应该获取当前主窗体的对象的。
      

  20.   

    做一个动态连接库,把open和close分开两个方法,想开就开,相关就关,不过需要自己管理资源,不能忘了close,否则要出错地
      

  21.   

    sunlumail 配置文件 <add key = "workstation id=ZQB;packet size=4096;integrated security=SSPI;data source=localhost;persist security info=False;initial catalog=SMOOW " /> 把键值写到键名上哒
      

  22.   

    谢谢各位XDJM,结贴了。
    感觉自己很多东西还不是太懂,要学的东西很多。