update 分等因子得分表 set defen ="  + fenzhi + " where 编号=" + bianhao  我想在dateset里来进行修改,到最后再一起更新数据库。所以要用到ds.Tables["分等因子得分表"].Rows[i]["defen"] = fenzhi; 在这里i是行号。我想用符合条件的行来代替行号,应该怎么做?谢谢!

解决方案 »

  1.   

    你可以
    DataRow[] drs = ds.ds.Tables["分等因子得分表"].Select(条件);
    然后再去修改drs里面的值
      

  2.   

    DataRow[] drs=ds.Tables["分等因子得分表"].Select(...)
    foreach(DataRow dr in drs)
    {
    dr["defen"] = fenzhi
    }
      

  3.   

    DataRow[] drs = ds.Tables["分等因子得分表"].Select("编号=" + bianhao);
                                             foreach ( DataRow dr in drs)
                                             {
                                             dr[objname] = fenzhi;
                                             }
    改为这样后可以运行在更新时出现这样的错误。
    DataTable“分等因子得分表”中缺少 SourceColumn“源表名称”的 DataColumn“源表名称”。
      

  4.   

    objname 是我在前面循环时定义的变量。
      

  5.   

      public void rJS() { 
                    OleDbCommand cmd = con.CreateCommand();
                    //从数据表中得到数据.
                    //将数据表存入DataSet中
                    //将数据库填充到缓存中
                    ds.Tables.Clear();
                    ad.SelectCommand = new OleDbCommand("SELECT * FROM 分等因子得分表", con);
                    ad.MissingSchemaAction = MissingSchemaAction.AddWithKey;
                    ad.Fill(ds, "分等因子得分表");
                    ad.SelectCommand = new OleDbCommand("SELECT * FROM 分等因子数据表", con);
                    ad.Fill(ds, "分等因子数据表");
                    ad.SelectCommand = new OleDbCommand("SELECT * FROM 分等作物规则库", con);
                    ad.Fill(ds, "分等作物规则库");
                    ad.SelectCommand = new OleDbCommand("SELECT * FROM 计算表", con);
                    ad.Fill(ds, "计算表");
                    OleDbCommandBuilder objcmdBuilder = new OleDbCommandBuilder(ad);
                    ad.UpdateCommand = objcmdBuilder.GetUpdateCommand();
                    ad.InsertCommand = objcmdBuilder.GetInsertCommand();
                    ad.DeleteCommand = objcmdBuilder.GetDeleteCommand();
                    int max = ds.Tables["分等作物规则库"].Rows.Count;
                    progressBar1.Minimum = 0;
                    progressBar1.Maximum = max;
                    progressBar1.BackColor = Color.Green;
                    progressBar1.Visible = true;
                    lblProgress.Visible = true;
     foreach(DataRow drgz in ds.Tables["分等作物规则库"].Select("1>0")) 
                        {
                            string zwname = drgz["作物名称"].ToString();
                            int fenzhi = Convert.ToInt16(drgz["分值"]);
                          
                            foreach (DataRow drjs in ds.Tables["计算表"].Select("是否计算=1")) 
                            {
                                string oldname = drjs["源字段名称"].ToString();
                                string objname = drjs["目标表字段"].ToString();
                                     string gzz = drgz[oldname].ToString();
                                     if (gzz != "")
                                     {
                                         foreach (DataRow drsj in ds.Tables["分等因子数据表"].Select("作物名称= '" + zwname + "' and " + oldname + " = '" + gzz+"'"))
                                         {
                                             int bianhao = Convert.ToInt32(drsj["编号"]);
                                             //cmd.CommandText = "update 分等因子得分表 set " + objname + "=" + fenzhi + " where 编号=" + bianhao;
                                             //cmd.ExecuteNonQuery();
                                             DataRow[] drs = ds.Tables["分等因子得分表"].Select("编号=" + bianhao);
                                             foreach ( DataRow dr in drs)
                                             {
                                             dr[objname] = fenzhi;
                                             }
                                         }  }                        }
    progressBar1.Value++;
                        lblProgress.Text = Convert.ToString(progressBar1.Value * 100 / max) + "%";
                        Application.DoEvents();
                    }
                    ad.Update(ds,"分等因子得分表");
                    textBox1.Text = "已更新记录";
                    if (progressBar1.Value == max)
                    {
                        MessageBox.Show("已完成更新!", "完成提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }            
            }
      

  6.   

    CLR 无法从 COM 上下文 0x1b2518 转换为 COM 上下文 0x1b2688,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积。要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。息。 我这个程序运行时有时也会有这个错误,不知道是什么原因?
      

  7.   


    DataRow[] drs = ds.Tables["分等因子得分表"].Select("编号=" + bianhao);
                                             foreach ( DataRow dr in drs)
                                             {
                                             dr[objname] = fenzhi;
                                             }
      

  8.   

    foreach中是只读操作,可以这样赋值么?
      

  9.   

    //cmd.CommandText = "update 分等因子得分表 set " + objname + "=" + fenzhi + " where 编号=" + bianhao;
                                             //cmd.ExecuteNonQuery();
    //程序是可以运行的。并且正确。
    DataRow[] drs = ds.Tables["分等因子得分表"].Select("编号=" + bianhao);
                                             foreach ( DataRow dr in drs)
                                             {
                                             dr[objname] = fenzhi;
                                             }
    //程序是不可以运行的。