DataGridView编辑后立即更新到数据库的两种方法
DataGridView控件是微软预先写好的一个显示数据的控件,功能非常强大,可以显示来自数据库表的数据和XML等其他来源的数据。
方法一:基于DataAdapter对象创建一个CommandBulider,用来生成Sql命令,修改数据源,从而直接更改数据表的内容。
前提是:
1.这个表必须有主键,否则该对象无法生成Update和delete、insert的Sql命令,报异常:
对于不返回任何键列信息的 SelectCommand,不支持 UpdateCommand 的动态 SQL 生成。
2.实例化SqlCommandBuilder对象的数据适配器对象SqlDataAdapter必须预先设置好SelectCommand属性
3.更新的表中不能包括image类型的字段(列)
由于出错的情况有很多,程序员无法完全掌握,所以我们强烈建议将更新代码写在try catch里
下面是此方法的实例:
/// <summary>
/// 数据适配器
/// </summary>
SqlDataAdapter adapter = null;
/// <summary>
/// 数据集对象
/// </summary>
DataSet dSet = null;
/// <summary>
/// 连接字符串
/// </summary>
private static string strConn = "server=.\\sqlexpress;database=MySchool;uid=sa;pwd=123456";
/// <summary>
/// 窗体加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form3_Load(object sender, EventArgs e)
{
adapter = new SqlDataAdapter("select * from UserInfo", strConn);
dSet = new DataSet();
adapter.Fill(dSet);
DGVMain.DataSource = dSet.Tables[0];
}
/// <summary>
/// 更新按钮点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//创建命令重建对象
SqlCommandBuilder scb = new SqlCommandBuilder(adapter);
//更新数据
try
{
//这里是关键
adapter.Update(dSet);
}
catch (SqlException ex)
{
MessageBox.Show(ex.Message);
}
}
由于各种原因,性能问题,安全问题和其他复杂的因素。
主要缺点:
1、 基于单表,只能对一个数据源表进行更新,如果要更新数据库
中的已改变的表,则不能用它来更新了。
2、 要求数据库中必须设置好主键字段
3、 不能对存有图片的数据库进行增删改操作
4、 执行起来,速度相对于非自动化慢(当然,是在数据库的规模
很大的情况下)
需要注意的地方:
1、 必须与DataAdapter结合使用
2、 实例化SqlCommandBuilder对象前,必须先指定好数据适配器
的填充命令(SelectCommand)。
3、 填充命令(Select 语句)中返回的列要包括主键列,否则将无
法产生Update,和Delete语句。
4、 使用命令构建器比手动编写SQL更好,但是它们只能处理一个
表,底层的数据库表必须有主键或唯一键。另外,数据适配器的SelectCommand属性必须有一个包含主键的查询。
这种方法在实际项目中根本不会用到,一些小项目和初学者可以尝试。
第二种方法:定位被修改的单元格,获取列名和id,构建SQL然后,然后执行更新操作。
这种方法比第一张方法复杂多,效果却是一样的,一般也不太会去用。这里简单介绍一下。思路是:点击单元格触发DGV的CellBeginEdit事件,在此事件中保存原先的值到成员字段中,然后在DGV的CellEndEdit事件中修改数据,执行更新。
具体的代码:
#region DGV直接编辑修改数据的功能
/// <summary>
/// 用来存放DGV单元格修改之前值
/// </summary>
Object cellTempValue = null;
/// <summary>
/// DGV单元格开始编辑时触发的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DGVMain_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
cellTempValue = DGVMain.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
}
/// <summary>
/// DGV单元格结束编辑时触发的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DGVMain_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
//判断编辑前后的值是否一样(是否修改了内容)
if (Object.Equals(cellTempValue,
DGVMain.Rows[e.RowIndex].Cells[e.ColumnIndex].Value))
{
//如果没有修改,则返回
return;
}
//判断用户是否确定修改
if (MessageBox.Show("确定修改?", "提示", MessageBoxButtons.OKCancel,
MessageBoxIcon.None) != DialogResult.OK)
{
//如果不修改,恢复原来的值
DGVMain.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = cellTempValue;
return;
}
//修改数据库的数据
string sql = String.Format("update set {1}='{2}' where 商品编号='{3}'",
DGVMain.Columns[0].DataPropertyName, //所选单元格列名
DGVMain.Rows[e.RowIndex].Cells[e.ColumnIndex].Value, //所选单元格修改后的值
DGVMain.Rows[e.RowIndex].Cells[0].Value //所选行的商品编号
);
try
{
OleDbHelper.ExecuteNonQuery(CommandType.Text, sql);
}
catch (OleDbException ex)
{
MessageBox.Show(ex.Message);
}
//刷新数据
LoadDGV();
}
#endregion
个人建议的解决方案:做一个ContextMenu菜单,绑定DGV,菜单中有修改数据和删除数据,当用户选择整行后,点击右键选择修改信息,立即弹出一个窗口,根据该行的id重新从数据库中取出该行记录的所有值,赋值到各个文本框中,然后点击更新,执行更新操作。这是最最纯洁的方法。
分类: C#.Net
DataGridView编辑后立即更新到数据库的两种方法的更多相关文章
- C++连接mysql数据库的两种方法
本文主要介绍了C++连接mysql数据库的两种方法,希望通过本文,能对你有所帮助,一起来看. 现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用a ...
- python学习--python 连接SQLServer数据库(两种方法)
1. python 学习.安装教程参照: http://www.runoob.com/python/python-tutorial.html 2. 集成开发环境 JetBrains PyCharm C ...
- python更新数据库脚本两种方法
最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 import MySQ ...
- 【Python】python更新数据库脚本两种方法
最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 1 import ...
- MySQL 创建数据库的两种方法
使用 mysqladmin 创建数据库 使用普通用户,你可能需要特定的权限来创建或者删除 MySQL 数据库. 所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mys ...
- c#取数据库数据 ---两种方法
通常有以下两种方式 SqlDataReader 和SqlDataAdapter|DataSet方式 SqlDataReader 方式使用方式如下: using System; using System ...
- MySQL 删除数据库的两种方法
使用 mysqladmin 删除数据库 使用普通用户登陆mysql服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库. 所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 ...
- c#访问数据库的两种方法以及事务的两种方法
//2015/07/03 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
- C#将Excel数据表导入SQL数据库的两种方法(转)
最近用写个winform程序想用excel 文件导入数据库中,网上寻求办法,找到了这个经过尝试可以使用. 方法一: 实现在c#中可高效的将excel数据导入到sqlserver数据库中,很多人通过循环 ...
随机推荐
- 编辑当前目录及其子目录,对比指定文件大小 (bat)
@echo off :: 设置对比大小校验(单位为kb) set COMPARE=100 ::指定起始文件夹 cd %~dp0/ set DIR_PATH=%cd% :: 输出文件目录 set RES ...
- Python之路Day08
文件操作 open() -- 打开 open通过Python控制操作系统打开文件 f=open('文件路径',mode='r',encoding='utf-8') mode -- 不写就默认是r f ...
- pandas处理csv,分组统计
需求: /tmp/demo/data下有10个csv文件,按col0和col1分组分别统计col2和col3总和并计算col2和col3的商 # encoding:utf-8 import panda ...
- Markdown进阶教程
Markdown是很好用的轻量级标记语言,许多开发人员喜欢使用Markdown来记录学习心得和写博客.本篇博客主要介绍Markdown的高级技巧教程,Markdown的基础教程已经在上篇介绍过了. ...
- 己亥清爽恢复系列之数据文件4篇:DROP表后如何恢复(非闪回技术)
己亥清爽系列说明:清爽系列是作为恢复系列的基础篇,基于FS(File System)文件系统的手工还原恢复,也叫基于用户管理的还原恢复,来自于博客园AskScuti. 实验说明:你不小心Drop掉了一 ...
- C#设置一个控件可以鼠标拖动
C#设置一个控件可以鼠标拖动: 新建一个C#项目, 创建一个label控件, 设置label的鼠标按下和抬起事件分别为:label1_MouseDown和label1_MouseUp. 对代码进行如下 ...
- 从心出发-刷leetcode写给5年后的自己
而立之年终未立,不惑而年犹存惑!这或许就是所谓的中年危机吧! 自认为是一个"勤奋"的人,又"未有寸功",天天碌碌,不知何为. "常立志"而未 ...
- 剑指offer 面试题 删除链表中重复的节点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- 操作系統3-內存管理(Linux內存管理)
操作系統3-內存管理(Linux系統的內存管理方法) 9.Linux系統的內存管理方法 Linux採用"按需調頁"算法,支持三層管理策略.由於Intel CPU在硬件級提供了段式存 ...
- mysql时间戳详解及运用
1.在已有表cms_nrgl_st 增加时间戳,这个时间是当前时间精确到秒的 alter table cms_nrgl_st add time_stamp TIMESTAMP DEFAULT CURR ...