需求:

  我想要实现这样一个效果:用户可以在表中通过右键新建行、删除行(这两个后面再写),编辑数据后进行保存。这里保存需要做一个区分,就是新增的和修改的。他们的区别就是新增的主键为空,而修改的因为原本就存在于数据库中,所以是有主键的。

解决方案:

  方案1:就根据主键的区别来做。保存时,先获取当前行,判断是否有主键,如果没有主键直接保存为新行;如果有主键,修改数据库中原来的数据;

try
{
CasingProgramDAL dalCasingProgram = new CasingProgramDAL();
foreach (DataRow dr in dtCasingProgram.Rows)//循环查找到表中的每一行,判断是否有主键
{
//返回值如果大于0,则保存成功了
dalCasingProgram.SaveData(dr);//调用函数进行保存操作,我这里没有对其返回值进行判断
}
}
catch (Exception ex)
{
XtraMessageBox.Show(ex.Message, Properties.Resources.ErrorTitle);
}
 public int SaveData(DataRow dr)
{
using (DbOperHandler doh = new Common().Doh())
{
doh.Reset(); doh.AddFieldItem("WellID", CODS.Common.Well.JcWellID);
doh.AddFieldItem("CasingProgram", dr["CasingProgram"].ToString().Trim());
doh.AddFieldItem("BitDiameter", dr["BitDiameter"].ToString().Trim());
doh.AddFieldItem("DrillingDepth", dr["DrillingDepth"].ToString().Trim());
doh.AddFieldItem("MudDensity", dr["MudDensity"].ToString().Trim());
doh.AddFieldItem("CasingOD", dr["CasingOD"].ToString().Trim());
doh.AddFieldItem("CasingWallThick", dr["CasingWallThick"].ToString().Trim());
doh.AddFieldItem("CasingTopDepth", dr["CasingTopDepth"].ToString().Trim());
doh.AddFieldItem("CasingShoeDepth", dr["CasingShoeDepth"].ToString().Trim());
doh.AddFieldItem("CementReturnDepth", dr["CementReturnDepth"].ToString().Trim());
if (dr["ID"].ToString() == "")
{
//主键为空,新增记录
return doh.Insert("jcCasingProgram");
}
else
{
//更新记录
doh.ConditionExpress = "ID=" + dr["ID"].ToString().Trim();
return doh.Update("jcCasingProgram");
}
}
}

可是这样做的话,有主键的数据有修改的和没修改的,修改过得需要保存,没修改过得如果也保存的话虽然不会出错,但是终究比较浪费资源。而且如果数据量很大的话,这种弊端更为严重。毕竟用户一次修改量一般不会特别大。所以最好是对有主键的数据进行一下判断,于是有了方案2。

方案2:判断行的当前状态,如果是修改了的(Modified),则保存;否则不保存。

                if (dr["ID"].ToString()=="")
{//主键为空,新增记录
return doh.Insert("jcCasingProgram");
}
if (dr.RowState.ToString() == "Modified")
{//更新记录
doh.ConditionExpress = "ID=" + dr["ID"].ToString().Trim();
return doh.Update("jcCasingProgram");
}
return -;

或者也可以把新增数据的判断由判断其主键是否为空改为判断其当前状态是否为(Added)。

这样的话,就可以实现用户修改表时只对修改过得行进行保存了。

DataTable数据存储问题的更多相关文章

  1. WPF中Grid绑定DataTable数据。

    1.首先引用DocumentFormat.OpenXml.dll 2.然后新建一个OpenExcelHelper类,将Excel转化为Datatable. /// <summary>    ...

  2. Kooboo CMS技术文档之三:切换数据存储方式

    切换数据存储方式包括以下几种: 将文本内容存储在SqlServer.MySQL.MongoDB等数据库中 将站点配置信息存储在数据库中 将后台用户信息存储在数据库中 将会员信息存储在数据库中 将图片. ...

  3. Android之数据存储的五种方法

    1.Android数据存储的五种方法 (1)SharedPreferences数据存储 详情介绍:http://www.cnblogs.com/zhangmiao14/p/6201900.html 优 ...

  4. Android之网络数据存储

    一.网络保存数据介绍 可以使用网络来保存数据,在需要的时候从网络上获取数据,进而显示在App中. 用网络保存数据的方法有很多种,对于不同的网络数据采用不同的上传与获取方法. 本文利用LeanCloud ...

  5. Android之文件数据存储

    一.文件保存数据介绍 Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的.文件可用来存放大量数据,如文本.图 ...

  6. Android之SharedPreferences数据存储

    一.SharedPreferences保存数据介绍 如果有想要保存的相对较小键值集合,应使用SharedPreferences API.SharedPreferences对象指向包含键值对的文件并提供 ...

  7. Atitit 数据存储视图的最佳实际best practice attilax总结

    Atitit 数据存储视图的最佳实际best practice attilax总结 1.1. 视图优点:可读性的提升1 1.2. 结论  本着可读性优先于性能的原则,面向人类编程优先于面向机器编程,应 ...

  8. Android数据存储之SQLCipher数据库加密

    前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...

  9. Android数据存储之GreenDao 3.0 详解

    前言: 今天一大早收到GreenDao 3.0 正式发布的消息,自从2014年接触GreenDao至今,项目中一直使用GreenDao框架处理数据库操作,本人使用数据库路线 Sqlite----> ...

随机推荐

  1. SpringBoot系列: 所有配置属性和官方文档

    Spring Boot 通用配置参数https://docs.spring.io/spring-boot/docs/current/reference/html/common-application- ...

  2. 轴对称 Navier-Stokes 方程组的点态正则性准则 I

    在 [Lei, Zhen; Zhang, Qi. Criticality of the axially symmetric Navier-Stokes equations. Pacific J. Ma ...

  3. vue使用md5,base64方法

    在前端加密代码虽然对安全没有提高,但是可以避免明文传输,提供用户隐私保护,还是很有必要的. 首先安装js-md5,js-base64. 在vue中引入. 之后就可以直接使用了,一般的做法是先把密码转行 ...

  4. golang slice分割和append copy还是引用

    转载自:http://studygolang.com/articles/724 1. slice1:= slice[0:2] 引用,非复制,所以任何对slice1或slice的修改都会影响对方 dat ...

  5. 🍓 DOM常用基础知识点汇总(入门者适用) 🍓

    铛-今天又没啥事,来总结一下DOM的基础知识.(公司没活干我也很无奈

  6. kerbose常用操作

    1.查看有那些用户认证 kadmin.local -q "list_principals" 2.用keytab文件进行认证 kinit -kt /root/keytab/hive. ...

  7. Spring-boot 国际化

    在application.properties文件中配置 spring.message.basename=i18n.login 页面使用 th:text="#{login.tip}" ...

  8. ESP8266代码中的存储标记

    const uint8 MyArr[1024] ICACHE_RODATA_ATTR = {0}; void MyFun() ICACHE_FLASH_ATTR { } 这种 ICACHE 开头的宏作 ...

  9. Centos 7 telnet 详解

    telnet命令 telnet命令用于登录远程主机,对远程主机进行管理.telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了.但仍然有 ...

  10. html form action

    action 行为 一.j_security_check  登陆检查 <!DOCTYPE html> <html> <head> <meta charset= ...