【问题标题】:Getting the same attributes for every member (what is not desired)为每个成员获取相同的属性(不需要的)
【发布时间】:2015-02-03 11:05:33
【问题描述】:

我正在创建几个静态全局实例。这是全局类:

public static class global_instances {

    public static Orders order1 = new Orders ();
    public static Orders order2 = new Orders ();
    public static Orders order3 = new Orders ();
    public static Orders order4 = new Orders ();
    public static Orders order5 = new Orders ();
    public static Orders order6 = new Orders ();
}

Orders 类包含多个字段,例如 id、name 等。

我正在使用 mysql 阅读器为这些对象字段填充独特的属性。

问题是:对象的每个静态成员在分配它们后都具有相同的属性,正是最后一条数据记录。但是每条记录都应该是唯一的,就像在我的数据库中一样。这是作业类:

internal static class Assignments
{
    private static Queue<int> assign_ids = new Queue<int>();

    internal static void orders()
    {
        for (int i = 1; i <= 6; ++i)
        {
            assign_ids.Enqueue(i);
        }

        MySql.Data.MySqlClient.MySqlConnection sql_connection = null;
        sql_connection = new MySql.Data.MySqlClient.MySqlConnection("server=localhost; user id=root; password=123; database=tables; persist security info=False");

        MySql.Data.MySqlClient.MySqlCommand sql_command = new MySql.Data.MySqlClient.MySqlCommand();

        sql_command.Connection = sql_connection;

        sql_connection.Open();
        string id_string = Convert.ToString(assign_ids.Peek());
        sql_command.CommandText = "SELECT * FROM orders WHERE id='" + id_string + "';";
        var sql_reader = sql_command.ExecuteReader();

        for (int i = 1; i <= 6; ++i)
        {
            id_string = Convert.ToString(assign_ids.Peek());
            sql_command.CommandText = "SELECT * FROM orders WHERE id='" + id_string + "';"; assign_ids.Dequeue();
            while (sql_reader.Read())
            {
                switch (i)
                {
                    case 1: global_instances.order1.modify(sql_reader.GetString(0), sql_reader.GetString(1), sql_reader.GetUInt16(2), sql_reader.GetString(3), sql_reader.GetString(4), sql_reader.GetString(5), sql_reader.GetInt16(6), sql_reader.GetInt16(7), sql_reader.GetString(8), sql_reader.GetString(9));
                        break;
                    case 2: global_instances.order2.modify(sql_reader.GetString(0), sql_reader.GetString(1), sql_reader.GetUInt16(2), sql_reader.GetString(3), sql_reader.GetString(4), sql_reader.GetString(5), sql_reader.GetInt16(6), sql_reader.GetInt16(7), sql_reader.GetString(8), sql_reader.GetString(9));
                        break;
                    case 3: global_instances.order3.modify(sql_reader.GetString(0), sql_reader.GetString(1), sql_reader.GetUInt16(2), sql_reader.GetString(3), sql_reader.GetString(4), sql_reader.GetString(5), sql_reader.GetInt16(6), sql_reader.GetInt16(7), sql_reader.GetString(8), sql_reader.GetString(9));
                        break;
                    case 4: global_instances.order4.modify(sql_reader.GetString(0), sql_reader.GetString(1), sql_reader.GetUInt16(2), sql_reader.GetString(3), sql_reader.GetString(4), sql_reader.GetString(5), sql_reader.GetInt16(6), sql_reader.GetInt16(7), sql_reader.GetString(8), sql_reader.GetString(9));
                        break;
                    case 5: global_instances.order5.modify(sql_reader.GetString(0), sql_reader.GetString(1), sql_reader.GetUInt16(2), sql_reader.GetString(3), sql_reader.GetString(4), sql_reader.GetString(5), sql_reader.GetInt16(6), sql_reader.GetInt16(7), sql_reader.GetString(8), sql_reader.GetString(9));
                        break;
                    case 6: global_instances.order6.modify(sql_reader.GetString(0), sql_reader.GetString(1), sql_reader.GetUInt16(2), sql_reader.GetString(3), sql_reader.GetString(4), sql_reader.GetString(5), sql_reader.GetInt16(6), sql_reader.GetInt16(7), sql_reader.GetString(8), sql_reader.GetString(9));
                        break;
                }//end switch

            }
            sql_reader.Close();
            sql_reader = sql_command.ExecuteReader();
        }
        sql_connection.Close();

    }

}

我正在使用webform输出数据,正在调试和研究网络,但找不到解决方案。

这是订单类: 公共类订单:I_Orders { 受保护的静态字符串版本; 受保护的静态字符串稀有性; 受保护的静态 uint id; 受保护的静态字符串名称; 受保护的静态字符串类型; 受保护的静态字符串关联; 受保护的静态 int 点; 私有静态整数跨度; 受保护的静态字符串要求; 受保护的静态字符串特价;

    internal Orders (){
        edition = "none";
        rarity = "";
        id = 0;
        name = "";
        type = "";
        affilations = "";
        points = 0;
        span = 0;
        requirements = "";
        specials = "";
    }
    public void modify(string edi, string rar, uint i_d, string nam, string typ, string aff, int poi, int spa, string requ, string spec) {
        edition = edi;
        rarity = rar;
        id = i_d;
        name = nam;
        type = typ;
        affilations = aff;
        points = poi;
        span = spa;
        requirements = requ;
        specials = spec;
    }

    public string get_edition() { return edition; }
    public string get_rarity() { return rarity; }
    public uint get_id() { return id; }
    public string get_name() { return name; }
    public string get_type() { return type; }
    public string get_affilations() { return affilations; }
    public int get_points() { return points; }
    public int get_span() { return span; }
    public string get_requirements() { return requirements; }
    public string get_specials() { return specials; }
}

我需要访问整个项目中的订单对象。你能给我全球替代品吗?

我正在使用switch语句,因为sql语句更改了6次,并且只修改了一次。

编辑

我实现了 IDisposable 接口并在作业类中使用我的对象。但仍然具有相同的属性,即使我在我的网络表单中修改对象(用于测试目的)而不调用分配方法。

【问题讨论】:

  • 请向我们展示非常规命名的objects 类的代码。另请注意,像这样的全局状态是一个真的坏主意,尤其是在网络环境中......而且你所有的变量名也是非常规的,你不是妥善处理您的任何资源。
  • 这就是你正在做的 - 重复相同的查询六次,每次将所有行一一写入同一个全局实例上,i 指向的那个,不是 与结果的顺序有关。这段代码有太多问题——全局变量、迭代、连接语句......
  • 这段代码没有意义。为什么不简单地选择 ID 在所需范围内的所有记录?
  • 我随机选择了 6 个超过 50 的 id。这是我的帖子中留下的,对不起。

标签: c# mysql asp.net


【解决方案1】:

您可能可以通过删除 Queue&lt;int&gt; assign_ids; 来修复它。 改变

Convert.ToString(assign_ids.Peek())

在循环之外:

id_string = "1"

循环内部:

id_string = i.ToString()

附带说明,您应该注意 IDisposable 处理、代码结构和命令参数处理。 一次性对象最好使用 using 语句处理。 您应该避免代码重复(您在循环内部和外部复制命令执行代码)。 避免字符串连接,这会导致 sql 注入和 sql 查询计划缓存的性能问题。了解如何在 sql 命令中使用参数。

【讨论】:

  • 感谢您的回答,但主要问题仍然存在。实例的所有成员都具有相同的属性。我随机选择了 6 个超过 50 的 id。那是在我的帖子中留下的,对此感到抱歉
【解决方案2】:

我的 Orders 类字段是静态的,因此可能只有一个实例副本。

仅当您只需要一份静态成员时才使用它们。

【讨论】:

    猜你喜欢
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    相关资源
    最近更新 更多