如何把DataGrid中修改的数据存入数据库中,如果表中存在该记录,则更新,如果表中不存在该记录,则插入记录。
数据库中表的结构如下:
字段名     字段类型
===========================
UName           Varchar(50)
MName           Varchar(50)
Opt1            Bit(1)
Opt2            Bit(1)
Opt3            Bit(1)
在DataGrid中显示
MName     Opt1     Opt2     Opt3
==================================
M1          0       1        1
M2          1       0        0
M3          0       0        0
M4          0       0        0现在在数据表中已经有了UName="A" 的两条记录
A M1 0 1 1
A M2 1 0 0
如果在DataGrid中修改了值,如果保存到数据库?

解决方案 »

  1.   

    1、DATAGRID 有无跟 datatable 或 dataset 绑定 ? 
    2、datatable 或 dataset 有无跟数据库建立对应关系?
      

  2.   

    如果是SqlConnection就加上
    SqlCommandBuilder CmdBuider = new SqlCommandBuilder(dataAdapter);
    _dataAdapter.DeleteCommand = CmdBuider .GetDeleteCommand();
    _dataAdapter.InsertCommand = CmdBuider .GetInsertCommand();
    _dataAdapter.UpdateCommand = CmdBuider .GetUpdateCommand();
      

  3.   

    其他的连接类型也有响应的CommandBuilder
      

  4.   

    To:tonyye1979(淘涛)
    Sql="Select MName,Opt1,Opt2,Opt3 From Table1 Where UName = 'A'"
    用该语句查询出所有UName="A的记录,并绑定到DataGrid.
      

  5.   

    如果是SqlConnection就加上
    SqlCommandBuilder CmdBuider = new SqlCommandBuilder(dataAdapter);
    dataAdapter.DeleteCommand = CmdBuider .GetDeleteCommand();
    dataAdapter.InsertCommand = CmdBuider .GetInsertCommand();
    dataAdapter.UpdateCommand = CmdBuider .GetUpdateCommand();
      

  6.   

    To:dasanhai(合子)
    能写的具体点吗?最好能根据我问题中的表写。谢谢!
      

  7.   

    写一个存储过程,然后在datagrid模板列中写update command事件,调用存储过程即可。
      

  8.   

    SqlDataAdapter da;
    SqlConnection sqlConn;
    DataSet ds;
    string strConnectInfo="连接字符串";sqlConn= new SqlConnection(strConnectInfo );
    public void UpdateDataSource(DataSet ChangedRows)
    {
    try 
             {
    // 在有挂起的更改时,只需要更新数据源即可。
    if ((ChangedRows != null)) 
    {
    // 打开连接。
    sqlConn.Open();
    // 尝试更新数据源。
    da.Update(ChangedRows,"TableName");
    }
    }
    catch (System.Exception updateException) 
    {
    // 在此处添加错误处理代码。
    throw updateException;
    }
    finally 
    {
    // 无论是否引发了异常都关闭连接。
               sqlConn.Close();
    }
    }
    // 创建一个新数据集来保存对主数据集所做的更改。
    DataSet objDataSetChanges = new DataSet ();
    // 停止当前的任何编辑。
    this.BindingContext[ds,"TableName"].EndCurrentEdit();
    // 获取对主数据集所做的更改。
    objDataSetChanges = ds.GetChanges();
    // 检查是否做了任何更改。
    if ((objDataSetChanges != null)) 
    {
    try 
    {
    // 需要做一些更改,所以尝试通过调用 update 方法
    // 和传递数据集以及任何参数来更新数据源。
    this.UpdateDataSource(objDataSetChanges);
    ds.Merge(objDataSetChanges);
    ds.AcceptChanges();
    }
    catch (System.Exception eUpdate) 
    {
                // 在此处添加错误处理代码。
    MessageBox.Show (eUpdate.Message );
    ds.RejectChanges ();
    //throw eUpdate;
    }
    // 添加代码以检查返回的数据集中是否有任何可能已被
    // 推入到行对象错误中的错误。
    }
      

  9.   

    To:funsuzhou(羡米奇)(努力ing,成为专家中!目标:自己编一个ERP软件!) 
    ds.Merge(objDataSetChanges);
    为什么要这样做?
      

  10.   

    加上UpdateCommand方法
    private void datagrid_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    int ID = (int) datagrid.DataKeys[(int) e.Item.ItemIndex];
        
    string Mname = ((TextBox)e.Item.Cells[1].Controls[0]).Text;
                                string opt1 = ((TextBox)e.Item.Cells[2].Controls[0]).Text;
                               string opt2 = ((TextBox)e.Item.Cells[3].Controls[0]).Text;
                               string opt3 = ((TextBox)e.Item.Cells[4].Controls[0]).Text;
    string sql = 
    "UPDATE 表名 SET Mname =\"" + Mname + 
    "\", opt1 =\"" + opt1 + "\",opt2 =\"" + opt2 + "\",opt3 =\"" + opt3 + "\"  " + " WHERE 表.key=" + ID;
    ExecuteNonQuery(sql);
        
    datagrid.EditItemIndex = -1;
    ReadRecords(); }
      

  11.   

    首先要将更新记录与你数据库中的主键值做一个判断:
    if (修改后的值==数据库中的主键值)
    {
    执行一个更新操作
    }
    else
    {
    执行一个插入操作
    }
      

  12.   

    private void cmdAdd_Click(object sender, System.EventArgs e)
    { AfficheManagerDTO afficheManagerDTO = new AfficheManagerDTO();
    AfficheManagerBPO afficheManagerBPO = new AfficheManagerBPO();// selFont.DataSource = new Table();
    // selFont.DataBind();
    if(FreeTextBox1.Text.ToString().Trim()=="")
    {
    OppoPrompt.Alert("公告内容不允许为空!请重新输入!",this.Page);
    return;
    }
    else
    {
    afficheManagerDTO.INFO_CONTENT=FreeTextBox1.Text.ToString();
    }

    afficheManagerDTO.INFO_ID  = new MaxID().GetNewID("TB_INFO","INFO_ID");
    // newsexDTO.INFOC_NAME =drTYPE.SelectedItem.Text.ToString(); if(txtNEWSTITLE.Text.ToString().Trim().Length<=50)
    {
    afficheManagerDTO.INFO_HEADING=CheckUserData.GetFilterStr(txtNEWSTITLE.Text.ToString().Trim());
    }
    else
    {
    OppoPrompt.Alert("标题不能超过了50个字母或汉字,请重新输入",this.Page);
    return;
    } if(txtNEWSFITTITLE.Text.ToString().Trim().Length<=50)
    {
    afficheManagerDTO.INFO_SUBHEADING=CheckUserData.GetFilterStr(txtNEWSFITTITLE.Text.ToString().Trim());
    }
    else
    {
    OppoPrompt.Alert("标题不能超过了50个字母或汉字,请重新输入",this.Page);
    return;
    }
    // affichemanagerexDTO.INFO_HEADING="<Font color=\"#000000\">txtNEWSTITLE.Text.ToString().Trim()</Font>";

    if(drpClor.SelectedItem.Text.ToString()=="黑色")
    {
    afficheManagerDTO.INFO_HEADING_COLOR="#000000";
    }
    if(drpClor.SelectedItem.Text.ToString()=="红色")
    {
    afficheManagerDTO.INFO_HEADING_COLOR="#FF0000";
    }
    if((drpClor.SelectedItem.Text.ToString()=="暗红色"))
    {
    afficheManagerDTO.INFO_HEADING_COLOR="#9E0A37";
    }
    if((drpClor.SelectedItem.Text.ToString()=="绿色"))
    {
    afficheManagerDTO.INFO_HEADING_COLOR="#00FF00";
    }
    if((drpClor.SelectedItem.Text.ToString()=="蓝色"))
    {
    // Color color = Color.FromArgb(0x00, 0xFF, 0x00);
    afficheManagerDTO.INFO_HEADING_COLOR="#0000FF";
    }
    if((drpClor.SelectedItem.Text.ToString()=="黄色"))
    {
    afficheManagerDTO.INFO_HEADING_COLOR="#FFFF00";
    }

    afficheManagerDTO.INFO_HEADING_FONT=drpFont.SelectedItem.Text.ToString();
    afficheManagerDTO.INFO_SIZE=Convert.ToInt32(drpSize.SelectedItem.Text.ToString()); afficheManagerDTO.INFO_KEYWORD=txtKEY.Text.ToString().Trim();
    afficheManagerDTO.INFO_AUTHOR=txtNEWSNAME.Text.ToString().Trim();
    afficheManagerDTO.INFO_SOURCE=txtNEWSSOURCE.Text.ToString().Trim(); if(txtINFOVALIDDATE.Text.ToString().Trim()=="")
    {
    afficheManagerDTO.INFO_VALID_DATE=DateTime.Now;
    }
    else
    { if(Convert.ToDateTime(txtINFOVALIDDATE.Text.ToString().Trim())<DateTime.Now)
    {
    OppoPrompt.Alert("发布日期不能小于当前时间,请重新输入!",this.Page);
    return;
    }
    else
    {
    afficheManagerDTO.INFO_VALID_DATE=Convert.ToDateTime(txtINFOVALIDDATE.Text.ToString().Trim());
    }// OppoPrompt.Alert("第"+d.ToString()+"条存在有效合同,不允许删除!",this.Page);
    }
    if(txtINFOINVALIDDATE.Text.ToString().Trim()=="")
    {
    afficheManagerDTO.INFO_INVALID_DATE=null;
    }
    else
    {  
    if(Convert.ToDateTime(txtINFOINVALIDDATE.Text.ToString().Trim())<Convert.ToDateTime(txtINFOVALIDDATE.Text.ToString().Trim()))
          {
    OppoPrompt.Alert("失效日期不能小于发布日期,请重新输入!",this.Page);
    return;
          }
      else
      {
        afficheManagerDTO.INFO_INVALID_DATE=Convert.ToDateTime(txtINFOINVALIDDATE.Text.ToString().Trim());
      }

    }
    if (txtINFOHITNUM.Text.ToString().Trim()=="")
    {
    afficheManagerDTO.INFO_HIT_NUM=0;
    }
    else
    {
    afficheManagerDTO.INFO_HIT_NUM=Int32.Parse(txtINFOHITNUM.Text.ToString().Trim());
    }

    afficheManagerDTO.ADD_PER_ID=base.PER_ID;
    afficheManagerDTO.ADD_DATE=DateTime.Now;
    afficheManagerDTO.INFOC_ID=Int32.Parse(drTYPE.SelectedValue.ToString());
    afficheManagerDTO.INFO_ISSTOP_REASON="";
    afficheManagerDTO.INFO_ISSTOP="N"; MaxOrder MaxOrder = new MaxOrder();
    int SortOrder=MaxOrder.GetNewOrder("TB_INFO");
    afficheManagerDTO.SORT_ORDER=SortOrder; // string aa = "";
    // aa +="<font face="+""+"  size="+""+
    if (CkBPIC.Checked==true)
    {
    afficheManagerDTO.INFO_SHOW_HOME="Y";
    }
    else
    {
    afficheManagerDTO.INFO_SHOW_HOME="N";
    } if(chkINFO_ISSTOP.Checked==true)
    {
    afficheManagerDTO.INFO_ISSTOP = "Y";
    txtINFO_ISSTOP_REASON.Visible=true;
    afficheManagerDTO.INFO_ISSTOP_REASON=txtINFO_ISSTOP_REASON.Text.ToString();
    }
    else
    {
    txtINFO_ISSTOP_REASON.Visible=false;
    afficheManagerDTO.INFO_ISSTOP = "N";
    afficheManagerDTO.INFO_ISSTOP_REASON="";
    } if(checkZD.Checked==true)
    {
    afficheManagerDTO.INFO_ISTOP="Y";
    }
    else
    {
    afficheManagerDTO.INFO_ISTOP="N";
    }
    afficheManagerBPO.AddAfficeManager(afficheManagerDTO);
    base.WriteOperateLog(FunCodeType.ADD,"增加公告");
    OppoPrompt.Alert("添加公告成功!",this.Page,"AfficheManager.aspx");

    }
      

  13.   

    To:gzhfpiaomaoyy
    如果数据库中有1000条记录,是不是要把更新的记录与这1000条记录依次判断?如果是更多记录呢?
    To:Developernet(探索者NET)
    如果要发代码,请留联系方式。
      

  14.   

    修改数据库?1。用dataset2。用command。
      

  15.   

    SqlDataAdapter1.Update((DataTable)DataGrid1.DataSource);
    或者
    SqlDataAdapter1.Update((DataSet)DataGrid1.DataSource));当然,你自己得写InsertCommand,UpdateCommand,DeleteCommand了
      

  16.   

    sqlSelectCommand.CommandText = "SELECT UName,MName,Opt1,Opt2,Opt3 FROM Table1"sqlInsertCommand.CommandText = "INSERT INTO Table1 (UName,MName,Opt1,Opt2,Opt3) Value (@uname,@mname,@opt1,@opt2,@opt3);SELECT UName,MName,Opt1,Opt2,Opt3 FROM Table1 WHERE UName=@uname"
    sqlInsertCommand.Parameters.Add(new SqlParameter("@uname",SqlDbType.VarChar,50,"UName"))
    sqlInsertCommand.Parameters.Add(new SqlParameter("@mname",SqlDbType.VarChar,50,"UName"))
    sqlInsertCommand.Parameters.Add(new SqlParameter("@opt1",SqlDbType.Bit,50,"UName"))
    sqlInsertCommand.Parameters.Add(new SqlParameter("@opt2",SqlDbType.Bit,50,"UName"))
    sqlInsertCommand.Parameters.Add(new SqlParameter("@opt3",SqlDbType.Bit,50,"UName"))sqlUpdateCommand.CommandText = @"UPDATE Table1 SET Opt1 = @opt1,Opt2 = @opt2,Opt3=@opt3 WHERE (UName = @uname) AND (ModuleName = @mname);SELECT Opt1,Opt2,Opt3 FROM Table1 WHERE (UName = @uname AND MName = @mname)"请问我这样写对吗?
      

  17.   

    我是在导入数据时多加一个空白字段,用这个字段来确定当前数据是修改还是新增,到时根据它来进行update还是insert,觉得这种方法比较安全一点
      

  18.   

    我这里有个例子: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim ds1 As New Data.DataSet
            Dim ds2 As New Data.DataSet
            Dim ds3 As New Data.DataSet
            Dim ts As Data.SqlClient.SqlTransaction        Me.SqlConnection1.ConnectionString = ConnString//连接字符串,自己写一下。        ds1 = Nothing
            ds2 = Nothing
            ds3 = Nothing        ds1 = Me.MyToolbar1.DS.GetChanges(DataRowState.Added)
            ds2 = Me.MyToolbar1.DS.GetChanges(DataRowState.Deleted)
            ds3 = Me.MyToolbar1.DS.GetChanges(DataRowState.Modified)
            Try
                Me.SqlConnection1.Open()
                ts = Me.SqlConnection1.BeginTransaction(IsolationLevel.Serializable)
                Me.SqlInsertCommand1.Transaction = ts
                Me.SqlDeleteCommand1.Transaction = ts
                Me.SqlUpdateCommand1.Transaction = ts
                Me.SqlSelectCommand1.Transaction = ts
                If Not (ds1 Is Nothing) Then
                    'ds1.Tables("AA_User").Rows(0)("UserID") = Me.MyToolbar1.DS.Tables("AA_User").Rows.Count
                    'ds1.Tables("AA_User").Rows(0)("UserLB") = 1
                    ds1.Tables("AA_User").Rows(0)("sUserName") = Me.FlatTextBox1.Text.ToString()
                    ds1.Tables("AA_User").Rows(0)("sPassWord") = Me.FlatTextBox2.Text.ToString()
                    Me.SqlDataAdapter1.Update(ds1)
                End If            If Not (ds2 Is Nothing) Then
                    'ds2.Tables("AA_User").Rows(0)("sUserName") = Me.FlatTextBox1.Text.ToString()
                    'ds2.Tables("AA_User").Rows(0)("sPassWord") = Me.FlatTextBox2.Text.ToString()
                    Me.SqlDataAdapter1.Update(ds2)
                End If            If Not (ds3 Is Nothing) Then
                    ds3.Tables("AA_User").Rows(0)("sUserName") = Me.FlatTextBox1.Text.ToString()
                    ds3.Tables("AA_User").Rows(0)("sPassWord") = Me.FlatTextBox2.Text.ToString()
                    Me.SqlDataAdapter1.Update(ds3)
                End If
                ts.Commit()
            Catch ex As Exception
                ts.Rollback()
                MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Finally
                ts.Dispose()
                Me.SqlConnection1.Close()
                mydb = Nothing
            End Try
        End Sub
      

  19.   

    说明一下:
    用GetChanges方法得到要删除、更新、添加的行,
    在判断是哪一个操作,
    最后调用update方法,更新到数据库,注意:SqlDataAdapter的四个sql语句和存储过程要写好。
      

  20.   

    http://spaces.msn.com/members/DotNba/Blog/cns!1pSoTGYNn-2VaojJDQaXc1cg!843.entry
      

  21.   

    如果要更新或是删除记录,最好是用一个主键(至少是unique键),把它作为索引的定位阿
      

  22.   

    顶!http://spaces.msn.com/members/DotNba/Blog/cns!1pSoTGYNn-2VaojJDQaXc1cg!843.entry
      

  23.   

    是用的VS么?
    先自己用里面的数据库连接拖一下好了,省去很多代码的
    更新用datagrid就好了
    可以修改和显示数据库的东西
    不过添加数据要另外写东西的
    注意datagrid里面的几个事件(其中比较特殊的是ItemCommand)
    就这样,自己试试吧:)