处理数据库时的最佳做法

时间:2016-04-21 04:49:54

标签: c# sql database oop ado.net

我目前是学生,并且正在学习C#和数据库。不幸的是,我要去的学校没有使用C#来与数据库进行交互。所以我自己就是在学习。

我写过一些使用数据库和C#的小程序。它们运行良好,做我想做的事,即使它们可能没有正确构造。我现在正在写一个新程序,这将是我最大的程序,我希望它是正确的。该程序有许多窗体,类和一个包含18个表的SQL数据库。我现在构建它的方式是我的Windows窗体通常会创建一个类的新实例。让我们说客户。当点击保存按钮时,会创建一个新客户,分配给属性的值,并将该对象与组合框一起发送到客户类中的公共方法,或者我正在使用的任何内容。我还有一个名为Database的类,它包含我编写的所有SQL查询。这样一切都是一个地方。我通常会向数据库类发送一个字典作为填充参数,然后在客户类中使用它来填充组合框。我没有使用数据集,数据表或类似的东西。我直接与数据库合作。

这被认为是可以接受的,还是现实世界中没有?我真的希望在不久的将来某个时候能够这样做,所以我想正确地学习这个。我自己做了很多阅读,我看到人们如何去做很多变化。如果有人也有任何好的阅读建议我会很感激。

编辑,根据建议

添加代码段

在我的表单上添加新客户,我有一个位置可以放入他们的地址。我有两个组合框,一个用于州,一个用于城市。我对城市进行了过滤,以便仅显示处于状态组合框中所选状态的城市。所以在我的表单类中,我有一个方法来更改状态框索引。它看起来像这样。

    private void cboStates_SelectedIndexChanged(object sender, EventArgs e)
    {
        Address.GetFilteredCities(cboCity, (int)cboStates.SelectedValue);
    }

cboCity是城市组合框。在地址类中,我有一个看起来像这样的方法。 Cities是一个字典,包含键的int和值的字符串。 int是城市的ID,保存在我的数据库中。该值是城市名称,显示在组合框中。

    public static void GetFilteredCities(ComboBox box, int stateID)
    {
        cities.Clear();
        Database.GetFilteredCities(cities, stateID);

        if (cities.Count > 0)
        {
            box.DataSource = new BindingSource(cities, null);
            box.ValueMember = "Key";
            box.DisplayMember = "Value";
        }

        else
        {
            box.DataSource = new BindingSource(null, null);
        }
    }

然后在数据库类中,

    public static void GetFilteredCities(Dictionary<int, string> cities, int stateID)
    {
        try
        {
            using (SqlConnection conn = new SqlConnection(connString))
            {
                conn.Open();
                SqlCommand grab = new SqlCommand("SELECT CityID, CityName FROM tblCities WHERE StateID = " + stateID, conn);
                using (SqlDataReader read = grab.ExecuteReader())
                {
                    while (read.Read())
                    {
                        cities.Add((int)read["CityID"], read["CityName"].ToString());
                    }
                }
            }
        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error getting cities", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

有没有更正确的方法来做到这一点,还是这被认为是一种可接受的方式?我倾向于陷入困境,所以如果有更好的方法我宁愿现在学习。例如,出于任何原因更好地使用dataadapter和datatable?是否在使用程序时修改数据表,然后在出于任何原因更好地退出程序之前不将它们提交到数据库?

2 个答案:

答案 0 :(得分:1)

很少有现代应用程序包含任何sql,它们通常使用可以为您生成sql的工具。查看使用“实体框架”或“nhibernate”作为几个示例的一些示例。甚至可以玩一个像RavenDB这样的对象数据库...你的类可以直接保存到数据库中。

答案 1 :(得分:0)

您也可以调用存储过程。我相信你可能会在一些遗留应用中看到相当多的东西。