代码之家  ›  专栏  ›  技术社区  ›  confused_programmer

在C#中的表单之间共享数据库连接的最佳方式是什么?[已关闭]

  •  0
  • confused_programmer  · 技术社区  · 9 年前

    我有一个主窗口窗体,可以打开许多其他窗体。所有表单都有一个公共的oracle数据库连接。

    我刚接触C#(到目前为止一直在使用visual basic),我不确定实现这一点的最佳方法。

    潜在选项:

    1. 将连接作为输入传递给子窗体。
    2. 将主窗口窗体作为父窗体传递给子窗体,并使用其成员变量连接。
    3. 我还没有考虑过其他一些选择。

    编辑:参见@C4ud3x的答案,以获取执行该功能的示例类。

    4 回复  |  直到 9 年前
        1
  •  8
  •   D Stanley    9 年前

    选项3:

    不要共享连接。不要为多个请求保持连接打开(除非它们是 立即 在代码中彼此紧随其后)。不要将连接公开为公共属性。

    连接是由.NET汇集的,因此创建连接不是一个昂贵的过程。在需要时创建连接,使用它,然后处理它。有效的方法是 using 阻碍。

    如果您想在中心位置存储连接 一串 习惯于 创造 连接很好,你可以使用app。配置或其他一些存储机制 那个 在一个地方。

        2
  •  0
  •   Fruchtzwerg    9 年前

    共享连接非常危险。如果您无论如何都想这样做,以下是一种可能的方法: 你可以定义一个接口来传递这个接口。这样,您可以定义其他属性,以便稍后共享。

    public interface IMainWindow
    {
      Datebase Db;
    }
    

    在主窗口中实现此界面:

    public Window MainWindow : IMainWindow
    {
      public Database Db
     ...
    }
    

    第二个窗口只能通过这个界面访问主窗口。

    public Window SecondWindow
    {
      private readonly IMainWindow Mw;
      public SecondWindow(IMainWindow Mw)
      {
        this.Mw = Mw;
        //Access the MainWindow database with Mw.Db
      }
    }
    
        3
  •  0
  •   paparazzo    9 年前

    您可以传递连接并让他们共享,但这不是推荐的做法。如果一个表单忘记关闭或处理异常,则会影响所有表单。若您进行并行或后台处理,那个么连接可能正在使用中。

    您确实需要共享连接字符串。这可以是一个共享变量,用于将其传递给ctor中的表单。

    Connection con = new Connection(conString);
    try 
    {
       con.Open();
       Command cmd = con.CreateCommand();
       // use command 
    }
    catch(Exception Ex)
    {
    }
    finally 
    {
       con.Close();
    }
    

    打开和关闭非常快。建议的做法是尽可能晚地打开,尽可能快地关闭,以减少连接数量。

    是的,您可以将所有这些封装在数据库类型类中,但我喜欢直接使用is。

        4
  •  0
  •   C4d    9 年前

    除了关于 whats wrong with your question 您可以为数据库添加一个新类,并从以下所有表单访问它:

    // database.cs
    public static class Database
    {
        static string connectionString = "user=...pass=...db=...etc";
    
        public static void ExecuteQuery(string query)
        {
            // open connection
            // send query
            // close connection
        }
    }
    
    // form1.cs
    public partial class Form1 : Form
    {
        public void doSomething()
        {
            Database.ExecuteQuery("Select something");
        }
    }
    
    // form2.cs
    public partial class Form1 : Form
    {
        public void anotherOne()
        {
            Database.ExecuteQuery("Update something");
        }
    }
    

    在这种情况下,您不需要在所有表单中声明变量或传递任何东西的实例。

    此外,你只需要关心清洁 open -> send -> close 为您的申请处理一次。