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_Re");
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();//初始的页面绑定方法
}}}

解决方案 »

  1.   

    btw:我是以我得数据表中的"设备编号"为关键字段,数据库自动生成了一个"编号"列,默认是以"编号"列为主键的,我把它设为了用"设备编号"为主键
      

  2.   

    看不了了.要么就是你没有判定条件.如果你where 条件不存在的话可能会更新表中全部数据.
      

  3.   

    我一项一项的试了一下,最开始更新是正常的,到了一定次数后,原行的数据是修改了,但是原行的原来数据却跑到下面一行把以前下面一行覆盖了
    是不是标识列的问题?我已经把数据库自动生成的"编号"列给删除了
    代码简单贴如下:
    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();//初始的页面绑定方法
    }}}
      

  4.   

    ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconupdatingdatabasewithdataadapterdataset.htm
      

  5.   

    sql语句打出来,在access里执行试试
      

  6.   

    update语句都是一些参数设置,怎么到access试?
      

  7.   

    解决了,谢谢各位
    我在Binding语句里多了个order by
    而 update重新提取时没有这个order by
    可能就这个原因导致了修改时候有重复现象