我应该如何正确地通过SqlConnection检索数据库记录?

时间:2013-02-28 19:09:14

标签: c# .net-4.0 standards sqlconnection

我确信这个问题已经被多次询问了,我挖了几个相似的问题,但找不到一个真正让我感到满意的问题。

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

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

DatabaseHelper.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;
    }

MainApp.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”bool,它会标记以查看查询是否完成,并且可以检查make并检查我使用的任何时候我需要从数据库中获取某些东西,但我确信这有问题到。

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

那么这里有什么值得保留的,还是需要从头开始重新构建?

0 个答案:

没有答案