0

我敢肯定这个问题已经被问过很多次了,我挖掘了一些类似的问题,但找不到一个真正像我想要的那样彻底解决它的问题。

我有一个应用程序,它使用数据库助手类来连接和检索数据库中的记录。我正在考虑重写它,并想知道最好的方法是什么。

现在大致是这样设置的(注意:这已经到位,并且有数千行这样的东西)。

数据库助手.CS

    private SqlConnection conn; 

    public DatabaseHelper()
    {
        // Create database connection
        conn = new System.Data.SqlClient.SqlConnection();
        SqlConnectionStringBuilder connection = new SqlConnectionStringBuilder();
        connection.ConnectTimeout = 150; // Microsft fix for timeout error (known bug)
        connection.MinPoolSize = 20; // Microsft fix for timeout error (known bug)
        connection.DataSource = Properties.Settings.Default.DBString;
        connection.InitialCatalog = Properties.Settings.Default.DBInitCatalog;
        connection.IntegratedSecurity = true;

        if (conn.State != ConnectionState.Connecting)
        {
            conn.ConnectionString = connection.ConnectionString;
        }
     }

    public bool Open()
    {
        if (this.IsOpen()) // IsOpen is just a method that checks connectionstate.
        { return true; }
        else
        {
            try
            {
                conn.Open();
                return true;
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                // omitted for post
            }
        }
        return false;
    }

    public bool Close()
    {
        if (!this.IsOpen())
        { return true; }
        try
        {
            conn.Close();
            return true;
        }
        catch (System.Data.SqlClient.SqlException ex)
        {
           // omitted for post
        }
        return false;
    }

    public List<string> GetTeamLeaders(string team)
    {
        List<string> leaders = new List<string>();
        string query = "Select Leader FROM Teams WHERE Team = @team_vc";
        try
        {
            using (SqlCommand cmd = new SqlCommand(query, conn))
            {
                cmd.Parameters.Add("@team_vc", SqlDbType.NVarChar).Value = team;
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    int column = sdr.GetOrdinal("Leader");
                    while (sdr.Read())
                    {
                        leaders.Add(sdr[column].ToString());
                    }
                }
            }
        }
        catch (Exception ex)
        {
            // omitted for post
        }
        return leaders;
    }

    private string GetTeamAbbrev(string team)
    {
        string abbrev= "";

        string query = "SELECT Abbrev FROM Teams where Team = @team_vc";
        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            cmd.Parameters.Add("@team_vc", SqlDbType.NVarChar).Value = team;
            try
            {
                abbrev= Convert.ToString(cmd.ExecuteScalar());
            }
            catch (Exception ex)
            {
                // omitted for post
            }
        }
        return (string.IsNullOrEmpty(location)) ? "None" : abbrev;
    }

主应用程序.CS

    private DatabaseHelper dbHelper;

    public MainApp()
    {
        InitializeComponent();
        dbHelper= new DatabaseHelper(); // Instantiate database controller
    }

    private void someButton_Click(object sender, EventArgs e)
    {
        List<string> teamLeaders = new List<string>();

        if (dbHelper.Open())
        {
            teamLeaders = dbConn.GetTeamLeaders(textboxTeam.Text);
            dbHelper.Close();
        }
        else
        {
            return;
        }
        // all the code to use results
    }

    private void someOtherButton_Click(object sender, EventArgs e)
    {
        List abbreviation = string.Empty;

        if (dbHelper.Open())
        {
            abbreviation = dbConn.GetTeamLeaders(textboxTeam.Text);
            dbHelper.Close();
        }
        else
        {
            return;
        }
        // all the code to use results
    }

现在我确信这是如何设置的一些非常严重的问题,但对我来说,我最大的抱怨总是不得不打开和关闭连接。

我的第一步是在DatabaseHelper 方法中移动open 和close,这样每个方法(即GetTeamLeaders)都会自己调用open 和close。但问题是,如果它确实无法打开,则很难将其反馈给主程序,主程序将尝试使用变量在创建时包含的任何值运行。我在想我几乎需要一个“out”布尔值来标记查询是否完成,并且可以检查 make 并检查任何时候我使用我需要从数据库中获取一些东西,但我确定有问题至。

这种方法的另一个大问题是,每当我想从另一个表单进行调用时,我必须在该表单上创建另一个助手实例,或者传递对主表单的引用。(目前我解决这个问题的方法是预先检索我需要的所有信息MainApp,然后将其传递给新表单)。我不确定当我重写它时是否有一种很好的静态方法来设置它,以便我可以从任何地方调用它。

那么这里有什么值得保留的吗,还是需要将它们全部剥离并从头开始重建?

4

0 回答 0