项目过来以后,

先肯定是做UI ,

1.在UI层先加载

2数据来源在dal层,

3再到model层,得到属性

   public int MId { get; set; }
public string MName { get; set; }
public string MPwd { get; set; }
public int MType { get; set; }

4再到dal这时候有属性了 做查询

 //步骤
1.构造sql 语句
//1构造要查询的sql语句
string sql = "select * from ManagerInfo";
//2使用helper进行查询,得到结果
DataTable dt = SqliteHelper.GetDataTable(sql);
//3将dt中的数据转存到list中
List<ManagerInfo> list=new List<ManagerInfo>();
//4触发器
foreach (DataRow row in dt.Rows)
{
list.Add(new ManagerInfo()
{
MId = Convert.ToInt32(row["mid"]),
MName = row["mname"].ToString(),
MPwd = row["mpwd"].ToString(),
MType = Convert.ToInt32(row["mtype"])
});
}
//将集合返回
return list;

5.得到数据后到Bll 层进行调用

 //1创建数据层对象
ManagerInfoDal miDal = new ManagerInfoDal();
//2.因为要在UI层进行得到表格所有要定义GetList
public List<ManagerInfo> GetList()
{
//调用查询方法
return miDal.GetList();

6.得到GetList后,然后到UI层进行数据加载


/1/创建业务逻辑层对象
   ManagerInfoBll miBll = new ManagerInfoBll();


 1    private void FormManagerInfo_Load(object sender, EventArgs e)
{
//2加载列表
LoadList();
} private void LoadList()
{
//禁用列表的自动生成
dgvList.AutoGenerateColumns = false;
//3调用方法获取数据,绑定到列表的数据源上
dgvList.DataSource = miBll.GetList();
}

7.链接数据库 再写配置文件

<connectionStrings> <add name="itcastCater" connectionString="data source=C:\Users\q1\Desktop\ItcastCater.db;version=3;"/> </connectionStrings>

注意点,其必须每个类都是 partial


增加

按理说先写model ,但是model 已经有了

所有

1.从dll层开始写

      /// <summary>
/// 插入数据
/// </summary>
/// <param name="mi">ManagerInfo类型的对象</param>
/// <returns></returns>
public int Insert(ManagerInfo mi)
{
//1.构造insert语句
string sql = "insert into ManagerInfo(mname,mpwd,mtype) values(@name,@pwd,@type)";
//2.构造sql语句的参数
SQLiteParameter[] ps = //使用数组初始化器
{
new SQLiteParameter("@name", mi.MName),
new SQLiteParameter("@pwd", Md5Helper.EncryptString(mi.MPwd)),//将密码进行md5加密
new SQLiteParameter("@type", mi.MType)
};
//3.执行插入操作
return SqliteHelper.ExecuteNonQuery(sql, ps);
}

2.到bll 层  public bool Add(ManagerInfo mi)

{ //调用dal层的insert方法,完成插入操作

return miDal.Insert(mi) > 0; }

3.到UI层 由于此时添加同时也有修改添加的左右所有

  private void btnSave_Click(object sender, EventArgs e)
{
//1接收用户输入
ManagerInfo mi = new ManagerInfo()
{
MName = txtName.Text,
MPwd = txtPwd.Text,
MType = rb1.Checked ? 1 : 0 //经理值为1,店员值为0
};
if (txtId.Text.Equals("添加时无编号"))//添加逻辑没有这个
{
#region 添加
//调用bll的Add方法
if (miBll.Add(mi))
{
//如果添加成功,则重新加载数据
LoadList();
}
else
{
MessageBox.Show("添加失败,请稍候重试");
} #endregion
}
else
{
#region 修改 mi.MId = int.Parse(txtId.Text);
if (miBll.Edit(mi))
{
LoadList();
} #endregion
} //清除文本框中的值
txtName.Text = "";
txtPwd.Text = "";
rb2.Checked = true;
btnSave.Text = "添加";
txtId.Text = "添加时无编号";
}

在这个时候.要判断类型,是经理还是店员要进行格式化,  e.Value = Convert.ToInt32(e.Value) == 1 ? "经理" : "店员";

1.在dal里面

   /// <summary>
/// 修改管理员,特别注意:密码
/// </summary>
/// <param name="mi"></param>
/// <returns></returns>
public int Update(ManagerInfo mi)
{
//为什么要进行密码的判断:
//答:因为密码值是经过md5加密存储的,当修改时,需要判断用户是否改了密码,如果没有改,则不变,如果改了,则重新进行md5加密 //定义参数集合,可以动态添加元素
List<SQLiteParameter> listPs=new List<SQLiteParameter>();
//构造update的sql语句
string sql = "update ManagerInfo set mname=@name";
listPs.Add(new SQLiteParameter("@name",mi.MName));
//判断是否修改密码
if (!mi.MPwd.Equals("这是原来的密码吗"))
{
sql += ",mpwd=@pwd";
listPs.Add(new SQLiteParameter("@pwd",Md5Helper.EncryptString(mi.MPwd)));
}
//继续拼接语句
sql+=",mtype=@type where mid=@id";
listPs.Add(new SQLiteParameter("@type",mi.MType));
listPs.Add(new SQLiteParameter("@id",mi.MId)); //执行语句并返回结果
return SqliteHelper.ExecuteNonQuery(sql, listPs.ToArray());
}

再到Bll层

public bool Edit(ManagerInfo mi)
{
return miDal.Update(mi) > 0;
}

删除

1.先到Dal层

   /// <summary>
/// 根据编号删除管理员
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public int Delete(int id)
{
//1构造删除的sql语句
string sql = "delete from ManagerInfo where mid=@id";
//2根据语句构造参数
SQLiteParameter p=new SQLiteParameter("@id",id);
//3执行操作
return SqliteHelper.ExecuteNonQuery(sql, p);
}

在到bll层

public bool Remove(int id)
{
return miDal.Delete(id) > 0;

}

在到UI层

   private void btnRemove_Click(object sender, EventArgs e)
{
//获取选中的行
var rows = dgvList.SelectedRows;
if (rows.Count > 0)
{
//删除前的确认提示
DialogResult result= MessageBox.Show("确定要删除吗?", "提示", MessageBoxButtons.OKCancel);
if (result == DialogResult.Cancel)
{
//用户取消删除
return;
} //获取选中行的编号
int id = int.Parse(rows[0].Cells[0].Value.ToString());
//调用删除的操作
if (miBll.Remove(id))
{
//删除成功,重新加载数据
LoadList();
}
}
else
{
MessageBox.Show("请先选择要删除的行");
}
}

数据库操作是sql的操作1的更多相关文章

  1. sql server操作2:查询数据库语句大全【转】

    注:以下操作均建立在上篇文章sql Server操作1的数据基础之上 一.实验目的 熟悉SQL语句的基本使用方法,学习如何编写SQL语句来实现查询 二.实验内容和要求 使用SQL查询分析器查询数据,练 ...

  2. 通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷

    原文:通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷.效果如下: 步骤1:通过MyEcl ...

  3. mysql导入导出sql文件(包括数据库和数据表的操作)

    废话不多说直接开始. 在windows命令行下登录mysql,创建一个test_01数据库,创建一个user表,并插入一条数据,如下 一.导出数据库test_01 1.退出数据库,在命令行中输入 my ...

  4. 关闭数据库下的所有连接操作 sql存储过程

    use master go )) as begin ),) declare @spid int set @sql='declare getspid cursor for select spid fro ...

  5. Django中使用mysql数据库并使用原生sql语句操作

    Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件mysql数据库,版本5.7 ...

  6. 在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作

    在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作 MyEclipse6.5    ,  mysq驱动jar包为mysql-connector ...

  7. 【mybatis】service层中一个方法中使用mybatis进行数据库的 多个修改操作,可能是update也可能是delete操作,但是sql语句命名执行并且在控制台打印出来了,但是数据库中未更新到数据【事务的问题】

    问题描述: service层中一个方法中使用mybatis进行数据库的 多个修改操作,可能是update也可能是delete操作,但是sql语句命名执行并且在控制台打印出来了,但是数据库中未更新到数据 ...

  8. Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库

    下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...

  9. Electron中使用sql.js操作SQLite数据库

    推荐sql.js——一款纯js的sqlite工具. 一.关于sql.js sql.js(https://github.com/kripken/sql.js)通过使用Emscripten编译SQLite ...

随机推荐

  1. bootstrap框架日期时间 开始日期和结束日期选择

    页面表单查询时,常要求要查询一个日期时间段内的数据,若采用bootstrap框架的datetimepicker插件来控制,需要了解怎么个用法:

  2. 「HNOI2008」「LuoguP3197」越狱(数论

    题目描述 原题来自:HNOI 2008 监狱有连续编号为 111 到 nnn 的 nnn 个房间,每个房间关押一个犯人.有 mmm 种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人信仰的宗教相同, ...

  3. 「LOJ#10072」「一本通 3.2 例 1」Sightseeing Trip(无向图最小环问题)(Floyd

    题目描述 原题来自:CEOI 1999 给定一张无向图,求图中一个至少包含 333 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方 ...

  4. ACM学习历程——NOJ1113 Game I(贪心 || 线段树)

    Description 尼克发明了这样一个游戏:在一个坐标轴上,有一些圆,这些圆的圆心都在x轴上,现在给定一个x轴上的点,保证该点没有在这些圆内(以及圆上),尼克可以以这个点为圆心做任意大小的圆,他想 ...

  5. 【Lintcode】103.Linked List Cycle II

    题目: Given a linked list, return the node where the cycle begins. If there is no cycle, return null. ...

  6. django 自定义日志配置

    如果不想使用 python 的 dictConfig 格式来配置 logger,可以制定自己的配置架构. LOGGING_CONFIG 配置定义了用来配置 django logger 的可调用函数,默 ...

  7. TFS 备注

    1,更改任何文件, 先checkout, 再继续更改. 2. 更新sln时, 一定要更新include文件 3. 每次提交代码放到shelf上, 自己本地建立2个workspace, 来进行coder ...

  8. Selenium Webdriver元素定位

    http://www.cnblogs.com/qingchunjun/p/4208159.html

  9. 搭建Android 开发环境(精华)

    http://www.cnblogs.com/xdp-gacl/p/4322165.html 孤傲苍狼 只为成功找方法,不为失败找借口! Android开发学习总结(一)——搭建最新版本的Androi ...

  10. 35.Docker安装Mysql挂载Host Volume

    连个文件系统有块区域Area,我们要做的是把两个Area做文件映射 jesse腾讯云上有个linux的环境,版本比较老了 简书的地址: https://www.jianshu.com/p/b3bf64 ...