项目过来以后,

先肯定是做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. codevs 1576最长严格上升子序列

    传送门 1576 最长严格上升子序列  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold   题目描述 Description 给一个数组a1, a2 ... an ...

  2. [转]BX9054: 各浏览器对 document.execCommand 方法的首参数可选值范围存在差异

    作者:钱宝坤 标准参考 无. 问题描述 execCommand 方法通常用于控制可编辑的 IFRAME 内容,制作富文本编辑器. 但他现在为止还是非标准的,方法的首参数 Commmands 的可选值由 ...

  3. AGC600 C Rabbit Exercise —— 置换

    题目:https://agc006.contest.atcoder.jp/tasks/agc006_c 考虑 \( i \) 号兔子移动后位置的期望,是 \( x_{i+1} + x_{i-1} - ...

  4. 事务之六:spring 嵌套事务

    一.基本概念 事务的隔离级别,事务传播行为见<事务之二:spring事务(事务管理方式,事务5隔离级别,7个事务传播行为,spring事务回滚条件) > 二. 嵌套事务示例 2.1.Pro ...

  5. android和iOS平台的崩溃捕获和收集

    转自:http://www.cnblogs.com/lancidie/archive/2013/04/13/3019349.html 通过崩溃捕获和收集,可以收集到已发布应用(游戏)的异常,以便开发人 ...

  6. C# FileStream分块读取和保存文件

    一 FileStream分块读取文件 public byte[] GetFileData(string fileName, long startPosition, long length) { byt ...

  7. 关于Flask使用Celery的实践经验分享

      最近大Boss反馈Celery经常出现问题,几经实践终于把问题解决了!于是乎有了这篇博客的诞生,算是一个实践经验的分享吧! 软件版本如下: Celery () Flask () RabbitMQ( ...

  8. MS SQL PIVOT数据透视表

    以前曾经做过练习<T-SQL PIVOT 行列转换>https://www.cnblogs.com/insus/archive/2011/03/05/1971446.html 今天把拿出来 ...

  9. MySQL8.0.16新特性:The Communication Protocol In Group Replication

    MGR优雅升级到MySQL8.0.16 传统的升级手段之一,5.7 MGR集群与8.0 MGR集群进行数据传输,程序切换新集群后测试是否正常. 如果不正常,要么将新集群的新增数据同步回旧集群,要么就舍 ...

  10. jquery获取元素对应高度

    https://www.cnblogs.com/sntetwt/p/3823592.html 获取点击元素距离页面的高度 $(select).offset().top - $(document).sc ...