标签:
本学期.net课的课程设计是做一个办公用品管理的软件,课堂上只给了五次课十个小时,由于老师给的需求文档也不是太全面,基本上是课下写,遇到问题上课再问老师,功能不对的地方再改。这个软件本身功能不复杂,毕竟是学校的作业而不是公司的产品,除去界面部分剩下的就是对数据库的操作。database里的表是老师建好的,总共也才四个表,不过老师建表时相关联的表并没有设置外键,主键也没有设成自增的,所以在增加和删除操作时,总是感觉很别扭,删除的时候不能级联删除,要一个一个表依次删除,费时费力,还好只有四个表。这种情况到公司肯定不会有的。
这篇文章就是想把我写这个小软件的过程再捋一捋,把过程中遇到的一些问题,学到的一些知识记录下来,以便以后需要时方便查看。
主界面:
菜单栏的各个子目录:
这是法语版的界面,介绍一下:
为了从数据库读数据,我首先创建了一个物品的实体类Article_Model,它有六个属性,分别对应XML文件中的六个属性,下图是XML文件中数据的格式:
接着创建专门读取XML文件数据的类:XML_Read,该类只有一个方法:
public List<Article_Model> Read_XML(string FileName) {
XmlDocument Doc = new XmlDocument();
Doc.Load(FileName);
XmlElement RootElem = Doc.DocumentElement;//root element
XmlNodeList ArticleNodes = RootElem.GetElementsByTagName("article");//all articles
List<Article_Model> Atl_Model_List = new List<Article_Model>();
//get datas
foreach (XmlNode Node in ArticleNodes) {
XmlNodeList Childs = Node.ChildNodes;
string Description = Childs.Item(0).InnerText;
string RefArticle = Childs.Item(1).InnerText;
string Marque = Childs.Item(2).InnerText;
string Famille = Childs.Item(3).InnerText;
string SousFamille = Childs.Item(4).InnerText;
string StrPrixHT = Childs.Item(5).InnerText;
string[] Str = StrPrixHT.Split(new char[] { ‘,‘});
string TempPrix = Str[0] + "." + Str[1];
float PrixHT = float.Parse(TempPrix);
Article_Model AM = new Article_Model(Description, RefArticle, Marque,
Famille, SousFamille, PrixHT);
Atl_Model_List.Add(AM);
}
return Atl_Model_List;
}
由于数据里商品价格一栏的数据小数点是逗号(老师你为什么要用逗号!!!!),所有又做了一次转换,将该值转成float类型。
打开文件选择对话框是时,由于只能选XML格式的文件,所以我加了一个过滤器:
OpenFileDialog Ofd = new OpenFileDialog();
Ofd.Filter = "xml files(*.xml)|*.xml";
Ofd.ShowDialog();
当把数据从XML文件存到List里再往数据库存时,有一个问题就是,数据可能重复。比如XML文件里有50条商品目录,但是它们可能属于30个不同的品牌,也就是说品牌,种类,子种类有可能有重复的,而且这些表的主键还不是自增的,这就需要在往数据库插数据之前先检查数据库中是否存在该数据,不存在则插入。因为要求用MVC模式,所以我把对数据库的操作的函数全封装到了一个类里:DB_Controller。以Marques表为例,解决方法:
DB_Controller DataBase = new DB_Controller();
//insert data to table Marques
if (DataBase.SelectMarquesTable(ArtModelList[i].marque) == -1)
{
DataBase.InsertMarquesTable(MarqueId++, ArtModelList[i].marque);
}
查询函数和插入函数如下:
public void InsertMarquesTable(int RefMarque,string Nom)
{
SQLiteConnection DB_Conn = new SQLiteConnection("Data Source=Mercure.SQLite;");
DB_Conn.Open();
string Sql = "INSERT INTO Marques (RefMarque,Nom) VALUES (" + RefMarque +
",‘" + Nom + "‘)";
SQLiteCommand Command = new SQLiteCommand(Sql, DB_Conn);
Command.ExecuteNonQuery();
DB_Conn.Close();
}
public int SelectMarquesTable(string Nom) {
SQLiteConnection DB_Conn = new SQLiteConnection("Data Source=Mercure.SQLite;");
DB_Conn.Open();
string Sql = "SELECT RefMarque FROM Marques WHERE Nom = ‘" + Nom +"‘";
SQLiteCommand Command = new SQLiteCommand(Sql, DB_Conn);
SQLiteDataReader Date = Command.ExecuteReader();
int I = -1;
if (Date.Read())
{
I = int.Parse(Date["RefMarque"].ToString());
}
else
{
I = -1;
}
Date.Close();
DB_Conn.Close();
return I;
}
数据库里一共有四张表,Articles,Marques,Familles,SousFamilles.示例图:
读完数据之后,点击“显示”按钮,便可把全部商品的信息显示出来,这需要四个表联合查询,用ListView控件显示信息。效果如下图:
对三个小表:Marques,Familles,SousFamilles的增加操作很简单,点击“添加”按钮,直接弹出一个对话框,用户输入名字即可。添加SousFamille时,用户要选择一个已经存在的Famille,所以在添加窗口上Famille用下拉列表ComboBox显示以供用户选择。对Articles的增加操作,也是一个窗口,窗口上的Marque,SousFamille也是用下拉列表ComboBox显示以供用户选择。
修改和删除三个小表:Marques,Familles,SousFamilles的数据时,相应的Articles表里的内容也要更新,并且显示窗口里的数据也要实时更新。
以Marques表为例,修改和删除函数:
public void UpdateMarquesTable(string DeNom,string Nom)
{
SQLiteConnection DB_Conn = new SQLiteConnection("Data Source=Mercure.SQLite;");
DB_Conn.Open();
string Sql = "UPDATE Marques SET Nom = ‘" + Nom + "‘ WHERE Nom = ‘" + DeNom + "‘";
SQLiteCommand Command = new SQLiteCommand(Sql, DB_Conn);
Command.ExecuteNonQuery();
DB_Conn.Close();
}
public void DeleteMarqueByName(string Nom)
{
SQLiteConnection DB_Conn = new SQLiteConnection("Data Source=Mercure.SQLite;");
DB_Conn.Open();
string Sql = "DELETE FROM Marques WHERE Nom = ‘" + Nom + "‘";
SQLiteCommand Command = new SQLiteCommand(Sql, DB_Conn);
Command.ExecuteNonQuery();
DB_Conn.Close();
}
总的来说,这个课程设计并不难,界面的话在VS2015里拖拽一下就画好了,数据的话主要还是操作数据库,只要控制好各个功能之间的逻辑问题,一切自然而然就成了。这是我第一次用C#,感觉和C++,java没多大区别,可能是接触的不深。不过计算机语言是相通的,认真掌握了一门,其他的也就好上手了。
标签:
原文地址:http://blog.csdn.net/liqiancao/article/details/51030565