怎么把选定的数据,点击OK按钮后,批量写入datatalbe后,可以在datatable中更改,然后一次性写入数据库。
我的代码如下,怎么不行?
public void insertBtn_click(object sender,EventArgs e)   
{   
//Response.Write("<script language=javascript>alert('测试成功!')</script>");  
DataSet ds = new DataSet("ds_dry");//创建一个名为ds_dry的DataSet DataTable dt = new DataTable("dt_dry");//创建一个名为dt_dry的DataTalbe dt.Columns.Add(new DataColumn("buyersid",typeof(string)));
dt.Columns.Add(new DataColumn("buyersname",typeof(string)));
dt.Columns.Add(new DataColumn("goodsid",typeof(string)));//为dt_dry表内建立Column
dt.Columns.Add(new DataColumn("goodsname", typeof(string)));
dt.Columns.Add(new DataColumn("goodsgg",typeof(string)));
dt.Columns.Add(new DataColumn("goodsjh",typeof(string)));
dt.Columns.Add(new DataColumn("goodsxs",typeof(string)));
dt.Columns.Add(new DataColumn("goodskc",typeof(string)));
dt.Columns.Add(new DataColumn("timer", typeof(DateTime))); for( int i = 0; i < jxcLrSerchGrid.Items.Count; i++ )
{
CheckBox lrchk = (CheckBox)jxcLrSerchGrid.Items[i].FindControl("jxcCheck");
if( lrchk.Checked == true )
{
string lrbuyersid=Session["buyeriId"].ToString();      //客户编号
string lrbuyersname=Session["buyersName"].ToString();  //客户名称
string goodsid=jxcLrSerchGrid.Items[i].Cells[1].Text; //得到商品编号
string goodsname= jxcLrSerchGrid.Items[i].Cells[2].Text; //得到商品名称
string goodsgg=jxcLrSerchGrid.Items[i].Cells[3].Text; //得到商品规格

TextBox dnjh;
dnjh=(TextBox)jxcLrSerchGrid.Items[i].FindControl("dnjh");  
TextBox dnxs;
dnxs=(TextBox)jxcLrSerchGrid.Items[i].FindControl("dnxs");
TextBox dnkc;
dnkc=(TextBox)jxcLrSerchGrid.Items[i].FindControl("dnkc"); DataRow dr = dt.NewRow();//注意这边创建dt的新行的方法。指定类型是DataRow而不是TableRow,然后不用new直接的用创建的DataTable下面的NewRow方法。
dr["buyersid"]=lrbuyersid;
dr["buyersname"]=lrbuyersname;
dr["goodsid"]=goodsid;
dr["goodsname"]=goodsname;
dr["goodsgg"] =goodsgg;
dr["goodsjh"] =dnjh.Text;
dr["goodsxs"] =dnxs.Text;
dr["goodskc"] =dnkc.Text;
dr["timer"] = s;
dt.Rows.Add(dr);
}
} ds.Tables.Add(dt);//别忘记向ds中添加table Session["ds"] = ds;//存储在sessin里面,方便下面调用
fill();

private void fill()
{
DataSet ds = (DataSet)Session["ds"];//进行强制类型转换
lrDataGrid.DataSource = ds;
lrDataGrid.DataBind();
}

解决方案 »

  1.   

    循环取出datatable中的数据,用parameter装起来,每循环一次读出一行数据,   
      然后用insert语句插入数据库!   
      objCmd.CommandText   =   "INSERT   INTO   yourtablename     VALUES   (@v0,@v1,@v2,@v3,@v4,@v5,@v6,@v7,@v8,@v9,@v10,@v11,..............)";   
      OleDbParameter   parameter;   
      try   
          {   
      for(int   i=0;i<   dt.Rows.Count;i++)   
      {   
            for(int   j=0;   j<   dt.Columns.Count;   j++)   
                  {   
      parameter   =   new   OleDbParameter("@v"+j.ToString(),OleDbType.VarChar);   
      parameter.Value   =dt.Rows[i][j].ToString();   
      objCmd.Parameters.Add(parameter);   
                  }   
      objCmd.ExecuteNonQuery();   
      objCmd.Parameters.Clear();   
      }   
      }   
              catch(Exception e)   
      {   
      Response.Write(e.Message.ToString());   
      objConn.Close();   
      return;   
      }
      

  2.   

    点ok按纽应该在rowcommand事件中做.
      

  3.   

    点ok按纽应该在rowcommand事件中做. 
    UP
      

  4.   

    for( int i = 0; i < jxcLrSerchGrid.Items.Count; i++ ) 
    jxcLrSerchGrid.Items.Count 点完OK安钮后,老是0
      

  5.   

    设计看着就有问题.你的ok按钮应该是对应每一行的.而你说"怎么把选定的数据,点击OK按钮后,批量写入datatalbe后,可以在datatable中更改,然后一次性写入数据库。 "感觉所说的像是一个总的按钮,然后把所有选中的行写入数据库.思路:
    把你选中的数据拼成一个DataTable,然后传给sqladapter去update()
    或是对选中的行进行循环,一行一行insert
      

  6.   

    buttion_cilck
    中能找到 CheckBox lrchk = (CheckBox)jxcLrSerchGrid.Items[i].FindControl("jxcCheck"); 这刚代码报错吗?
     
      

  7.   

    对整个进行遍历,循环读出拼写字符串,如果为了方便可以利用
    insert into aa 
    select 数据1,数据11 union all 
    select 数据2,数据22
    的写法
      

  8.   

    正好遇见这个问题,一般我用update只会更新一行的,怎么拼成dataTable然后更新?
      

  9.   

    没有报错,就是执行到for( int i = 0; i < jxcLrSerchGrid.Items.Count; i++ ) 这个地方,没有执行循环,我把jxcLrSerchGrid.Items.Count写到页面上了,每次点击OK按钮,jxcLrSerchGrid.Items.Count就是0,其它代码没错。
    能得到jxcLrSerchGrid.Items.Count数就解决问题了。
      

  10.   

    我就是这个意思,我的代码是把选中的数据,插入到datatalbe里面,可以多次插入,最后循环整个datatalbe,插入数据库。OK按钮执行的都是一个click事件,为了用户方便,所以才每行都加一个ok按钮。
      

  11.   

    改成下面的试试:
    for (int rowindex = 0; rowindex < this.GridViewPDXZ.jxcLrSerchGrid.Count; rowindex++)
    {
    CheckBox lrchk = (CheckBox)jxcLrSerchGrid.Rows[rowindex].Cells[0]..FindControl("jxcCheck");

    }
      

  12.   

    个人思路
    把要写的数据提取出来保存xml,
    需要更改的话就对这个xml进行操作,
    OK就把xml数据更改进数据库
      

  13.   

    贴错了,看下面的
    改成下面的试试: 
    for (int rowindex = 0; rowindex < this.jxcLrSerchGrid.Rows.Count; rowindex++) 

    CheckBox lrchk = (CheckBox)jxcLrSerchGrid.Rows[rowindex].Cells[0]..FindControl("jxcCheck"); 
     
    }
      

  14.   

    把DataTable写入Session?那么算了,你的程序不满足生产实践要求,整个程序流程就不应该存在。
      

  15.   

    你把DataTable放在Session中,翻到下一页,还是同样的方法加入newrow不行吗?
      

  16.   

    放在一个static 的 datatable 中,就相当于放在内存中了,插入到数据库后清掉这个就行了
      

  17.   

    用静态static,我很喜欢这个做法,目前项目中,用到了不少
      

  18.   

     OnRowDataBound="GridView1_RowDataBound" ---aspx中加类似的一句。
      

  19.   

    何为临时表?
    sql中的临时表有两种,全局临时表和局部临时表,通过以下语句创建:
    create table #临时表名(局部)

    create table ##临时表名(全局)
    这种临时表保存在内存,随页面的结束而结束!!楼主说的是实际的表吧!!
    建议楼主,保存的数据太复杂时,可以不用Session,而用局部临时表!!