c# - 处理数据库时的最佳实践

标签 c# sql database oop ado.net

我现在是一名学生,学习C语言和数据库。不幸的是,我要去的学校并没有使用C语言与数据库交互。所以我是自己学的。
我写了一些使用数据库和c的小程序。他们运作良好,做我想做的事,即使他们的结构可能不正确。我正在写一个新的程序,这将是我最大的,我希望它是正确的。该程序有许多windows窗体、类和一个包含18个表的sql数据库。我现在构建它的方式是我的windows窗体通常会创建一个类的新实例。比如说顾客。当点击save按钮时,将创建一个新的客户,为属性分配值,并且该对象与一个组合框一起发送到customer类中的一个公共方法,或者我正在使用的任何东西。我还有一个名为database的类,其中包含我编写的所有sql查询。这样一切都是一个地方。我通常会将一个字典作为参数发送给数据库类来填充,然后在customer类中使用它来填充组合框。我没有使用数据集、数据表或类似的东西。我直接处理数据库。
这被认为是可以接受的,还是在现实世界中不可以?我真的希望在不久的将来某个时候能以此为生,所以我想正确地学习。我自己读了很多书,我也看到人们阅读的方式有很多变化。如果有人也有什么好的阅读建议,我将不胜感激。
编辑,根据建议添加代码片段
在我添加新客户的表格上,我有一个位置让他们填写地址。我有两个组合框,一个是州的,一个是市的。我对城市进行了筛选,以便它只显示处于“状态”组合框中所选状态的城市。因此,在我的form类中,我有一个方法用于更改状态框索引。看起来像这样。

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

CBocity是城市组合框。在address类中,我有一个如下所示的方法。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是否更好?在使用程序时修改DATATATE,然后不提交到数据库,直到您出于任何原因更好地退出程序为止。

最佳答案

几乎没有现代应用程序包含任何sql,它们经常使用能够为您生成sql的工具。寻找一些使用“实体框架”或“nhibernate”作为例子的例子。也许甚至可以玩一个对象数据库,比如ravendb…在那里你的类可以有效地直接保存到数据库中。

关于c# - 处理数据库时的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36759923/

相关文章:

c# - a == b 和 (a & b) == b 有什么区别

mysql - 如果在 concat 里面

sql - 在 postgresql 中,当 case 语句为 true 时添加条件

java - 如何将具有状态的对象置于版本控制之下?这还有道理吗?

c# - 在 C# 中使用 XDocument 创建 XML 文件

c# - 网络摄像头捕获并转换为 avi

c# - 不同线程中的同步 GraphicsDevice

sql - 在多个父级的封闭表中移动

mysql - 搜索包含多个值的字段

mysql - 在不使用 PHP 的情况下更改 MySQL 查询的输出结构