【问题标题】:How to save multiple values from various controls in sql server database?如何从sql server数据库中的各种控件中保存多个值?
【发布时间】:2014-09-23 02:50:09
【问题描述】:

我正在使用 3 层架构设计 Windows 应用程序。我的一个表单包含动态生成的控件。我的问题是如何从我的数据库中的控件中保存多个值。我使用了 return 语句,但因为它只返回一个值,所以我的数据库只存储了每个控件的一个值。基本上我正在创建 BILL FORM。

我为每个控件创建了 8 个方法,并将它们的值传递到业务逻辑层的函数中,但是如上所述,它只保存了每个控件的一个值,而不是保存多个值。我也尝试使用元组,但它给了我“转换异常”

我的 8 种方法之一是:

 public string combo_box_1()
        {
            foreach (Control ctrl in this.Controls)
            {
                if (ctrl is ComboBox)
                {
                    if (ctrl.Name.Equals("combo_box_1"))
                    {
                        string main_category = ctrl.Text;
                        string[] arr1 = { main_category };
                        foreach (string alph in arr1)
                        {
                            MessageBox.Show(alph);
                            return alph;
                        }
                        return main_category;

                    }
                }
            }
            return null;
        }

这是元组版本:

public Tuple<string> combo_box_1()
        {
            foreach (Control ctrl in this.Controls)
            {
                if (ctrl is ComboBox)
                {
                    if (ctrl.Name.Equals("combo_box_1"))
                    {
                        string main_category = ctrl.Text;
                        Tuple<string> txt2 = new Tuple<string>(main_category);
                        return txt2;
                    }
                }
            }
            return null;
        }

我的业务层函数(元组版):

public bool save_bill(Tuple<string> CB1, Tuple<string> CB2, Tuple<string> CB3, Tuple<string> CB4, Tuple<string> NUD1, Tuple<string> CB5, Tuple<string> TB1, Tuple<string> TB2)
        {
            try
            {
                DAL obj = new DAL();
                obj.OpenConnection();
                obj.LoadSpParameters("save_bill", CB1, CB2, CB3, CB4, NUD1, CB5, TB1, TB2);
                obj.ExecuteQuery();
                obj.UnLoadSpParameters();
                obj.CloseConnection();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

在我的保存按钮后面编程(元组版本):

private void save_button_Click(object sender, EventArgs e)
        {
            BLL obj = new BLL();
            bool obj2 = obj.save_bill(combo_box_1(), combo_box_2(), combo_box_3(), combo_box_4(), numeric_up_down_1(), combo_box_5(), txt_box_1(), txt_box_2());
            if (obj2 == true)
            {
                MessageBox.Show("bill saved");
            }

            else
            {
                MessageBox.Show("bill cannot be saved");
            }

        }

【问题讨论】:

    标签: c# sql winforms 3-tier


    【解决方案1】:

    我必须承认我无法理解您的代码,但我认为这可能会有所帮助: 更改 save_bill 方法以接受字符串参数,不需要元组

    public bool save_bill(Tuple<string> CB1, Tuple<string> CB2, Tuple<string> CB3
        , Tuple<string> CB4, Tuple<string> NUD1, Tuple<string> CB5, Tuple<string> TB1
        , Tuple<string> TB2)
    

    public bool save_bill(string CB1, string CB2, string CB3, string CB4
    , string NUD1, string CB5, string TB1, string TB2)
    

    而不是为每个控件使用 8 个(奇怪的)方法

    bool obj2 = obj.save_bill(combo_box_1(), combo_box_2(), combo_box_3()
    , combo_box_4(), numeric_up_down_1(), combo_box_5(), txt_box_1(), txt_box_2());
    

    使用它并直接访问它们的值

    bool obj2 = obj.save_bill(combo_box_1.Text, combo_box_2.Text
    , combo_box_3.Text, combo_box_4.Text, numeric_up_down_1.Value.ToString()
    , combo_box_5.Text, txt_box_1.Text, txt_box_2.Text);
    

    有一些问题,例如您是否真的需要 ComboBox.Text 而不是 SelectedID,或者如果控件是动态创建的,那么您不应该通过它们的名称来引用它们等等,但希望这会有所帮助。

    【讨论】:

    • 我无法直接访问它们的值,因为此时它会引发一个错误,提示“名称 combo_box_1 和其他在当前上下文中不存在”。我的控件是在我命名为 void controls() 的函数中动态创建的,并且每次用户点击它时,都会在“添加”按钮中调用该函数,将创建一系列控件。其次,我需要将这些控件的所有值以“账单形式”存储在数据库中。基本上它是一个超市应用程序。
    • 我创建这 8 种方法的原因是因为我想访问它们的值,但我的主要问题是,例如客户购买了 20 件商品,因此每个商品将有 20 个控件系列 1,所以显然我想保存所有这 20 个项目的详细信息,但它只保存 1 个项目。
    • 您是否有理由为每个项目使用 8 个控件而不是每行代表一个项目的表格?如果你必须这样做,也许你可以用这 8 个控件制作一个复合控件,并用它来表示一个项目。保存时,您应该浏览所有复合控件并将每个项目保存到 DB。
    • 我刚刚尝试过使用这种方法,否则没有理由这样做。你能不能给我一些代码以便我理解它,因为我不是数据库专家。我能够在一个单独的字符串变量中获取每个控件的所有值,但是当我传递它时,每个控件只保存一个值。
    • 嘿,我的问题已解决,我如何将您的解决方案标记为关闭它的答案:)
    猜你喜欢
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多