需求:
我想要实现这样一个效果:用户可以在表中通过右键新建行、删除行(这两个后面再写),编辑数据后进行保存。这里保存需要做一个区分,就是新增的和修改的。他们的区别就是新增的主键为空,而修改的因为原本就存在于数据库中,所以是有主键的。
解决方案:
方案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 -1;
或者也可以把新增数据的判断由判断其主键是否为空改为判断其当前状态是否为(Added)。
这样的话,就可以实现用户修改表时只对修改过得行进行保存了。