none
求助,如何实现直接构造dt,批量更新数据库 RRS feed

  • 问题

  • YingKe.Common.Accounts ac = new YingKe.Common.Accounts();
          DataTable dt = new DataTable();
          DataColumn myDataColumn;
    
          myDataColumn = new DataColumn();
          myDataColumn.DataType = Type.GetType("System.Int32");
          myDataColumn.ColumnName = "ID";
          myDataColumn.ReadOnly = true;
          myDataColumn.AllowDBNull = false;
          myDataColumn.Unique = true;
          myDataColumn.AutoIncrement = true;
          myDataColumn.AutoIncrementSeed = 1;
          myDataColumn.AutoIncrementStep = 1;
          dt.Columns.Add(myDataColumn);
    
          myDataColumn = new DataColumn();
          myDataColumn.DataType = Type.GetType("System.Int32");
          myDataColumn.ColumnName = "UID";
          myDataColumn.AllowDBNull = false;
          dt.Columns.Add(myDataColumn);
    
          myDataColumn = new DataColumn();
          myDataColumn.DataType = Type.GetType("System.Int32");
          myDataColumn.ColumnName = "RID";
          myDataColumn.AllowDBNull = false;
          dt.Columns.Add(myDataColumn);
    
          string[] _tmp = Request.Form["having_roles"].Split(',');
          for (int i = 0; i < _tmp.Length; i++)
          {
            DataRow dr = dt.NewRow();
            dr["UID"] = Convert.ToInt32(Request.QueryString["id"]);
            dr["RID"] = _tmp[i];
            dt.Rows.Add(dr);
          }
    
          if (ac.SetUserRoles(dt)>0)
          {
            ClientScript.RegisterStartupScript(this.GetType(), "", "<script language='javascript'>alert('操作成功!');window.location.href='Users.aspx';</script>");
          }
          else
          {
            ClientScript.RegisterStartupScript(this.GetType(), "", "<script language='javascript'>alert('更新失败或者您没有变更用户的已有角色!');</script>");
          }
    
    
    
    public int SetUserRoles(DataTable dt)
        {
          SqlConnection conn = new SqlConnection(SqlHelper.ConnectionString);
          SqlCommand cmd = new SqlCommand("",conn);
          SqlDataAdapter da = new SqlDataAdapter(cmd);
          SqlCommandBuilder sb = new SqlCommandBuilder(da);
          return da.Update(dt);
        }
    
    

     

    我要做到的是:直接构造一个dt,然后提交到数据库。但是总是绕不过“SelectCommand.Text 需要初始化这步”(需要先查询到dt,然后修改dt,再提交dt)。求助有没有好的解决办法。

    2011年4月15日 6:40

答案

  • 首先要通过给DataAdapter.Update(DataTable)方法传入一个DataTable来更新数据库表的话,DataTable的表结构必须与数据库表的结构(structure or schema)相同.

    其次,通过DataAdapter.Update(DataSet)来直接更新数据库,需要将DataAdapter以参数传入来构建一个CommandBuilder对象,使用这个对象有俩个必须的工作要做:
    1. 需要指定SELECT命令,在DataAdapter构建的时候指定或者在SelectCommand参数里面指定都可以,并且SELECT命令只能从一个表里面获取数据.
    2. 至少要指定一个主键或者独立列(unique column),以作为SELECT命令的.

    当这俩个条件满足之后我们就可以构建CommandBuilder对象了.构建时Update, Insert, Delete语句都是自动创建的.


    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年4月20日 6:10
    版主
  • dear
    应该是要先连上资料库,然后才能更新,您可参考以下

    [ADO.NET] 如何使用 SqlDataAdapter (一)
    http://www.dotblogs.com.tw/yc421206/archive/2009/11/08/11468.aspx


    [Edit this entry.] [ADO.NET] 如何 使用 TableAdapter 物件(一)
    http://www.dotblogs.com.tw/yc421206/archive/2009/07/25/9675.aspx
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年4月21日 2:34

全部回复

  • 你直接构造的dt,和数据库没有关联的话,那么C#也不知道应该把你的数据提交到哪里。

    因此你必须要有selectcommand的初始化,这样才能知道你原来的数据是从哪里来的

    -----------------------------------------------------------------------------------

    个人愚见

     

    2011年4月15日 13:45
  • 首先要通过给DataAdapter.Update(DataTable)方法传入一个DataTable来更新数据库表的话,DataTable的表结构必须与数据库表的结构(structure or schema)相同.

    其次,通过DataAdapter.Update(DataSet)来直接更新数据库,需要将DataAdapter以参数传入来构建一个CommandBuilder对象,使用这个对象有俩个必须的工作要做:
    1. 需要指定SELECT命令,在DataAdapter构建的时候指定或者在SelectCommand参数里面指定都可以,并且SELECT命令只能从一个表里面获取数据.
    2. 至少要指定一个主键或者独立列(unique column),以作为SELECT命令的.

    当这俩个条件满足之后我们就可以构建CommandBuilder对象了.构建时Update, Insert, Delete语句都是自动创建的.


    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年4月20日 6:10
    版主
  • 你没有指定是哪个表的数据呀,需要分析selectcommand
    http://feiyun0112.cnblogs.com/
    2011年4月20日 8:49
    版主
  • dear
    应该是要先连上资料库,然后才能更新,您可参考以下

    [ADO.NET] 如何使用 SqlDataAdapter (一)
    http://www.dotblogs.com.tw/yc421206/archive/2009/11/08/11468.aspx


    [Edit this entry.] [ADO.NET] 如何 使用 TableAdapter 物件(一)
    http://www.dotblogs.com.tw/yc421206/archive/2009/07/25/9675.aspx
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年4月21日 2:34