更新奇怪的结果,不仅更新了自己还更新了下一行记录

greatdreamworld 2003-10-16 09:23:10
点击datagrid模板列的某一行编辑按钮时,进行修改后不仅把自己所在行更新了,还把下一行也更新了
我用的是access数据库,不知道这和数据库里自动增加的编号列有没有关系?
...全文
68 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
greatdreamworld 2003-10-27
  • 打赏
  • 举报
回复
解决了,谢谢各位
我在Binding语句里多了个order by
而 update重新提取时没有这个order by
可能就这个原因导致了修改时候有重复现象
greatdreamworld 2003-10-20
  • 打赏
  • 举报
回复
update语句都是一些参数设置,怎么到access试?
greatdreamworld 2003-10-17
  • 打赏
  • 举报
回复
我一项一项的试了一下,最开始更新是正常的,到了一定次数后,原行的数据是修改了,但是原行的原来数据却跑到下面一行把以前下面一行覆盖了
是不是标识列的问题?我已经把数据库自动生成的"编号"列给删除了
代码简单贴如下:
public void DEDR_Update(Object sender,DataGridCommandEventArgs E)
{string strSQL="SELECT * FROM 设备";//构建sql语句,connDM是连接字符串,已初始化
OleDbDataAdapter da=new OleDbDataAdapter(strSQL,connDM);//构建托管对象,以连接数据
DataSet ds=new DataSet();//新建一个dataset用以包含datatable表格数据
da.Fill(ds,"设备");//把dataset的对象ds存入到托管对象da中
DataTable dta=ds.Tables["设备"];//调出dataset中的表“设备”
int row=Convert.ToInt32(E.Item.ItemIndex);//获取要更新的那一行的行号
OleDbCommand odc=new OleDbCommand();
odc.Connection=connDM;
EditText1=(TextBox)E.Item.FindControl("Edit_MachineName");//网格中相应编辑状态下控件名
string MachineNameText=EditText1.Text.Trim();
dta.Rows[row]["设备名称"]=MachineNameText;
....
if(DateTime.Parse(EditText4.Text)>DateTime.Parse(EditText6.Text))
conn.Alert("制造日期应该早于始用日期!请重新输入",Page);
else
{dataGrid5.DataSource=dta.DefaultView;//用于界面显示
dataGrid5.DataBind();
odc.CommandText="UPDATE 设备 SET 设备名称='"+..."' WHERE 设备编号='"+Convert.ToString(dta.Rows[row]["设备编号"]).Trim()+"'";
//From_DBNull_to_null(object x)是一个从DBNull到null的方法
da.UpdateCommand=odc;
try{ da.Update(ds,"设备");//用于更新数据源,与updatecommand相配合 StateMessage.Text+="<b>更新数据成功</b>";
conn.Alert("恭喜!您已经修改数据成功!",Page);
}catch(Exception ee){StateMessage.Text+="<b>更新数据失败</b>;
}
finally{dataGrid5.EditItemIndex=-1;Binding();//初始的页面绑定方法
}}}
menuvb 2003-10-17
  • 打赏
  • 举报
回复
看不了了.

要么就是你没有判定条件.如果你where 条件不存在的话可能会更新表中全部数据.
suguanqun 2003-10-17
  • 打赏
  • 举报
回复
你的代码太长了,看起来很费力,建议你只更改两项,然后加断点逐步跟踪,你会看到再那里出错的!
greatdreamworld 2003-10-17
  • 打赏
  • 举报
回复
btw:我是以我得数据表中的"设备编号"为关键字段,数据库自动生成了一个"编号"列,默认是以"编号"列为主键的,我把它设为了用"设备编号"为主键
greatdreamworld 2003-10-17
  • 打赏
  • 举报
回复
public void DEDR_Update(Object sender,DataGridCommandEventArgs E)
{string strSQL="SELECT * FROM 设备";//构建sql语句,connDM是连接字符串,已初始化
OleDbDataAdapter da=new OleDbDataAdapter(strSQL,connDM);//构建托管对象,以连接数据
DataSet ds=new DataSet();//新建一个dataset用以包含datatable表格数据
da.Fill(ds,"设备");//把dataset的对象ds存入到托管对象da中
DataTable dta=null;
dta=ds.Tables["设备"];//调出dataset中的表“设备”用以方便的对行(rows)进行处理int row=Convert.ToInt32(E.Item.ItemIndex);//获取要更新的那一行的行号
OleDbCommand odc=new OleDbCommand();
odc.Connection=connDM;
EditText1=(TextBox)E.Item.FindControl("Edit_MachineName");//网格中相应编辑状态下控件名
string MachineNameText=EditText1.Text.Trim();
dta.Rows[row]["设备名称"]=MachineNameText;

EditText4=(TextBox)E.Item.FindControl("Edit_ZhizaoDate");
dta.Rows[row]["制造日期"]=Convert.ToDateTime(EditText4.Text.Trim());

EditText5=(TextBox)E.Item.FindControl("Edit_Zhizaobianhao");
dta.Rows[row]["制造编号"]=EditText5.Text;

EditText6=(TextBox)E.Item.FindControl("Edit_OriginDate");
OriginDateStr=EditText6.Text.Trim();
dta.Rows[row]["始用日期"]=DateTime.Parse(OriginDateStr).ToString("u",DateTimeFormatInfo.InvariantInfo);

EditText7=(TextBox)E.Item.FindControl("Edit_EngineNum");
string EngineNumText=EditText7.Text;
dta.Rows[row]["电动机总台数"]=Convert_to_null(EngineNumText);
//Convert_to_null(string s)是针对编辑框为空情况下的一种转换,这个字段为整形
EditText8=(TextBox)E.Item.FindControl("Edit_EnginePower");
dta.Rows[row]["电动机总千瓦"]=Convert_to_null(EditText8.Text.Trim());

EditText9=(TextBox)E.Item.FindControl("Edit_OriginValue");
dta.Rows[row]["原价值"]=Convert_to_null(EditText9.Text.Trim());

EditText10=(TextBox)E.Item.FindControl("Edit_Weight");
string weighttext=EditText10.Text.Trim();
dta.Rows[row]["重量"]=Convert_to_null(weighttext);

EditText11=(TextBox)E.Item.FindControl("Edit_Address");
dta.Rows[row]["安装地点"]=EditText11.Text.Trim();

EditText12=(TextBox)E.Item.FindControl("Edit_GongYi");
dta.Rows[row]["工艺参数"]=EditText12.Text;

EditText13=(TextBox)E.Item.FindControl("Edit_Remark");
dta.Rows[row]["备注"]=EditText13.Text;
if(DateTime.Parse(EditText4.Text)>DateTime.Parse(EditText6.Text))
conn.Alert("制造日期应该早于始用日期!请重新输入",Page);
else
{dataGrid5.DataSource=dta.DefaultView;//用于界面显示
dataGrid5.DataBind();
odc.CommandText="UPDATE 设备 SET 设备名称='"+Convert.ToString(dta.Rows[row]["设备名称"]).Trim()+"',制造日期='"+dta.Rows[row]["制造日期"]+"',制造编号='"+ dta.Rows[row]["制造编号"].ToString().Trim()+"',始用日期='"+dta.Rows[row]["始用日期"]+"',电动机总台数="+From_DBNull_to_null(dta.Rows[row]["电动机总台数"])+",电动机总千瓦="+From_DBNull_to_null(dta.Rows[row]["电动机总千瓦"])+ ",原价值="+From_DBNull_to_null(dta.Rows[row]["原价值"])+ ",重量="+From_DBNull_to_null(dta.Rows[row]["重量"])+",安装地点='"+dta.Rows[row]["安装地点"]+"',工艺参数='"+dta.Rows[row]["工艺参数"]+"',备注='"+dta.Rows[row]["备注"]+"' WHERE 设备编号='"+Convert.ToString(dta.Rows[row]["设备编号"]).Trim()+"'";
//From_DBNull_to_null(object x)是一个从DBNull到null的方法
da.UpdateCommand=odc;
try{ da.Update(ds,"设备");//用于更新数据源,与updatecommand相配合 StateMessage.Text+="<b>更新数据成功</b>";
conn.Alert("恭喜!您已经修改数据成功!",Page);
}catch(Exception ee){StateMessage.Text+="<b>更新数据失败</b></br>"+"error message:"+ee.Message+"</br>err source:"+ee.Source+"</br>errstacktrace:"+ee.StackTrace;
conn.Alert("对不起!您修改数据失败,请检查是否有非法操作!",Page);
}
finally{dataGrid5.EditItemIndex=-1;Binding();//初始的页面绑定方法
}}}
lucidaxy 2003-10-17
  • 打赏
  • 举报
回复
sql语句打出来,在access里执行试试
bing314 2003-10-17
  • 打赏
  • 举报
回复
ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconupdatingdatabasewithdataadapterdataset.htm
oldhunter 2003-10-16
  • 打赏
  • 举报
回复
可能是你的标识列重复
scale8292 2003-10-16
  • 打赏
  • 举报
回复
贴出代码!

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧