【问题标题】:How to add a new record in DB using MVC Winforms [closed]如何使用 MVC Winforms 在 DB 中添加新记录 [关闭]
【发布时间】:2012-08-18 15:39:25
【问题描述】:

我想使用 MVC 模式 winforms 将记录添加到数据库中。将记录添加到数据库中的功能正在运行,但我想通过使用对象方法来完成。

有人请我在这里用 MVC 模式做的错误是什么?

查看:

        using System;
using System.Data.SqlClient;
using System.Globalization;
using System.Windows.Forms;
using MVCwithDBFormReg.Controller;
using MVCwithDBFormReg.Model;

namespace MVCwithDBFormReg.View
{
    public partial class Form1 : Form, IUserView
    {

        private readonly User _model;
        public Form1(User model)
        {
            _model = model;
            InitializeComponent();
        }


        public event CreateUserHandler Create;

        private void button3_Click(object sender, System.EventArgs e)
    {
        _model.FirstName = FirstName;
        _model.LastName = LastName;
        _model.Language = Language;
        _model.Country = Country;
        _model.State = State;
        _model.Zipcode = Zipcode;
        _model.TimeZone = TimeZone;
        _model.Sex = Sex;
        _model.Month = Month;
        _model.Day = Day;
        _model.Year = Year;
        _model.Occupation = Occupation;

        Create(_model);

    }

    }
}

型号:

         namespace MVCwithDBFormReg.Model
{
    public class User
    {

        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Language{ get; set; }
        public string Country{ get; set; }
        public string State{ get; set; }
        public int Zipcode { get; set; }
        public string  TimeZone{ get; set; }
        public Gender Sex { get; set; }
        public enum Gender
         {
            Male = 1,
            Female = 2

         }
         public string Month { get; set; }
         public string Day { get; set; }
         public int Year { get; set; }
         public string Occupation { get; set; }


    }

控制器:

     namespace MVCwithDBFormReg.Controller
{
   public class UserController
   {


       private SqlConnection sqlConnection1;
       private void ViewOnSave(User model)
       {
           if (model.FirstName == "" || model.LastName == "")
               MessageBox.Show("Please enter your name");
           else
           {
               sqlConnection1.Open();

               string insert = "INSERT INTO REGISTER(FNAME, LNAME, LANG, COUNTRY, STATE, ZIPCODE, TIMEZONE, GENDER, BDAY, BMONTH, BYEAR, OCCUPATION) " +
                               "VALUES ('" + model.FirstName + "','" + model.LastName + "','"
                               + model.Language + "','" + model.Country + "','"
                               + model.State + "','" + model.Zipcode
                               + "','" + model.TimeZone + "','"
                               + model.Sex + "','" + model.Day + "','"
                               + model.Month + "','" + model.Year + "','"
                               + model.Occupation + "')";
               SqlCommand cmd = new SqlCommand(insert, this.sqlConnection1);
               cmd.ExecuteNonQuery();

               sqlConnection1.Close();
               MessageBox.Show("You have been successfully registered to our database.");
           }
       }
   }
}

【问题讨论】:

标签: c# sql winforms model-view-controller


【解决方案1】:

这东西在技术上并不完全是 MVC(我怀疑 MVC 在 WinForms 项目中是否有很多意义,MVVM 模式已经证明它自己更有用。虽然我可能错了,因为在某些特殊情况下 MVC 是有意义的)。

首先,你的模型类不是UserRegister,而是User。其次,您不一定需要 UserRegister 类,因为您可以在控制器中保存(这不是一个很好的做法,但对于培训目的来说足够简单)。或者,如果您真的想将数据库操作与控制器代码分开,您可以使用类似 Repository 模式的便利(就像一个 Repository 类中的 UserRegister、UserLoad、UserFind 类)。我建议阅读一些关于建筑和设计的 Martin Fowler 书籍(或只是互联网教程)。

现在我们已经了解了您的模型是什么(纯数据) - 用户。您的视图不应该有任何逻辑(例如将数据保存到数据库或计算泰迪熊的折扣) - 只有视图。视图绑定到模型,这意味着它显示模型有什么,并通过控件设置模型的属性。就像 - 您有一个用户名文本框,它显示来自 Model.Name 的数据并在更改时设置 Model.Name。

每当单击Save 按钮时,您的视图都会向您的控制器发送更改的 模型,以便它可以对其进行操作。然后控制器将事情拼凑在一起 - 比如要求您的 UserRegister 保存它从视图中获得的用户。顺便说一句,这里不需要事件,尽管你可以使用它们。

我将尝试以支持上述所有内容的方式显示您的代码更改:

查看:

private readonly User _model;
public Form1(User model)
{
    _model = model;
    InitializeComponent();
}

public event CreateUserHandler Create; // should be changed to use User 
//Function to create a new record into the DB
private void btnSave_click(object sender, System.EventArgs e)
{
    // if model is not bound via binding, it needs update before Create.
    Create(_model); // needs changes to current EventHandler
}

模型 - 没有变化; UserRegister - 死了。

某处(例如在 Delegates.cs 单独文件中):

public delegate void CreateUserHandler(User model);

控制器:

public UserController(IUserView view)
{
    _view = view;
    _view.Create += ViewOnSave;
}

private void ViewOnSave(User model)
{
    SqlConnection connection = new SqlConnection(connString);
    connection.Open();
    //... save query goes here
}

注意,这里没有使用存储库。无论如何,这个 MVC 仍然不完整且有缺陷,我建议阅读一些关于 ASP.NET MVC 的教程,以掌握 .NET 环境中的 MVC 模式。

【讨论】:

  • 非常感谢您的回复。遵循您的方法后,我在视图和控制器中都遇到了事件处理程序问题
  • 这就是我写它需要更改的原因。 :) 我会尝试在我的帖子中修复它。
  • 谢谢。在控制器中使用sqlconnection是不是很糟糕??
  • 这不是一个好习惯,但对于小型/学习项目来说足够舒适。事件处理程序已修复。
  • @Dmitriy Reznik:事件处理程序仍然存在同样的问题。
猜你喜欢
  • 2016-08-02
  • 2019-01-02
  • 2022-01-04
  • 1970-01-01
  • 2015-08-17
  • 2010-11-16
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多