需求:

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

解决方案:

  方案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. [Everyday Mathematics]20150305

    设 $f\in C^2[0,1]$, $$\bex f(0)=-1,\quad f'(1)=3,\quad \int_0^1 xf''(x)\rd x=1. \eex$$ 试求 $f(1)$. 解答: ...

  2. python之使用单元测试框架unittest执行自动化测试

    Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作. 单元测试框架即一堆工具的集合. 在说unittest ...

  3. PERFECT NUMBER PROBLEM(思维)

     题目链接:https://nanti.jisuanke.com/t/38220 题目大意:这道题让我们判断给定数字是否为完美数字,并给来完美数字的定义,就是一个整数等于除其自身之外的所有的因子之和. ...

  4. 浅谈axios

    在我们的项目中有用到: fetch有直接用的,也有自己封装之后用的; vue-resource在vue1的时候使用,把方法抽象出来后,总需要往方法里传 this.$http ,感觉是个超级不爽的设计, ...

  5. php 默认保几位小数,末尾为0去掉

    计算保留几位小数,末位为0舍去 // 计算 默认保留1位小数 protected function getSprintf($value,$count,$digit = 1) { $num = 0; i ...

  6. Django之验证码

    一.自己生成验证码 二.极验科技互动验证码 使用前步骤:下载官网文件——pip install geetest——引入其封装的js模块 代码分为三段:生成验证码——显示验证码——验证验证码. from ...

  7. TortoiseGit与GIt生成ssh秘钥添加到github账号的简单方法!简单使用

    今天升级了自己电脑上的git与TortoiseGit,全部换成了最新版,后来不知道怎么的git的秘钥还能使用,可以直接拉取或者提交ssh地址克隆的代码,可是小乌龟客户端就悲剧了 公司的项目有key.p ...

  8. 写给自己看的vue

    学习过程:自学(个人demo驱动),论坛,qq群多少听到vue,react(很抱歉只弄了hello world demo 虚拟dom 也是概念 到目前也没弄清楚)这类框架(工作经历前后端都折腾,老板指 ...

  9. js中子页面父页面方法 变量相互调用(转)

    原文:https://www.cnblogs.com/huangshuqiang/p/5734358.html (1)子页面调用父页面的方法或者变量: window.parent.方法()或者变量名w ...

  10. 【原创】大数据基础之Zookeeper(1)介绍、安装及使用

    zookeeper3.4.11 http://zookeeper.apache.org/ 一 简介 ZooKeeper is a centralized service for maintaining ...