我在程序中通过计算得到的数据存储在dataset的一个table中,大约有50几万条数据,然后用DataAdapter的update方法更新到真实的数据库中,但每次没更新几条都出现“无效的参数量”这个错误,出现的还不规律,有时候更新几百条就出现这个错误,有时候可以更新几千条,这是怎么回事呢??高手帮忙,很急!!

解决方案 »

  1.   

    可能是你程序生成的数据的数据类型,和数据库的表字段类型不一致,导致的.
    你可在更新前,设一个断点,查看一下DataTable里的数据,是否都是有效的数据.
      

  2.   

    public void cID()
            {
                OleDbDataAdapter ad = new OleDbDataAdapter();
                DataSet ds = new DataSet();
                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, "分值规则表");
                ad.SelectCommand = new OleDbCommand("SELECT * FROM 因子得分表", con);
                ad.Fill(ds, "因子得分表");
                //循环每块地的ID
                for (int i = 0; i < ds.Tables["土种代码库"].Rows.Count; i++) 
                {
                    int ID = Convert.ToInt32(ds.Tables["土种代码库"].Rows[i]["id"]);
                    //循环用户选择的作物种类
                    for (int j = 0; j < kind.Length; j++)
                    {
                        if (kind[j] != null)
                        {
                            //计算该地块种这种作物时因子属性数据的得分
                            getCent(ID, kind[j], name);
                        }
                    }               
                }
                OleDbCommandBuilder cbuilder = new OleDbCommandBuilder(ad);
                ad.Update(ds, "因子得分表");
            }
            //计算因子属性数据的得分
            public void getCent(int ID,string kind,string[] name)
            {
                DataRow[] dr = ds.Tables["土种代码库"].Select("id="+ID);
                int tzdm=Convert.ToInt32(dr[0]["土种代码"]);//取得该地块的土种代码
                DataRow[] drAttribute = ds.Tables["土种信息表"].Select("编号=" + tzdm);//取得该土种代码的因子属性值
                DataRow MyRow = ds.Tables["因子得分表"].NewRow();
                MyRow["id"] = ID;
                MyRow["作物种类"] = kind;
                for (int i = 0; i < name.Length; i++) //循环取得用户选择的因子的得分
                {
                    if (name[i] != null) 
                    {
                        string cName = name[i].ToString();
                        string value = drAttribute[0][cName].ToString();
                        DataRow[] drow = ds.Tables["分值规则表"].Select("作物种类='" + kind + "'");
                        for (int j = 0; j <drow.Length; j++)
                        {
                           string str = drow[j][cName].ToString();
                           if (str!="")
                           {
                               if (str == value)
                               {
                                   MyRow[cName] = drow[j]["分值"];
                                   break;
                                }
                            }
                         }             
                    }
                    
                }
                ds.Tables["因子得分表"].Rows.Add(MyRow);
            }
      

  3.   

    如果你的数据库是Sql server,建议你用事件探查器跟踪一下,取到出错前最后一条sql语句,然后单独执行分析错误原因。
      

  4.   

    不要把整个DataSet更新DataSet ds2 = ds.GetChanges();
    ds2.Update();
      

  5.   

    public void getCent(int ID,string kind,string[] name) 
            { 
                DataRow[] dr = ds.Tables["土种代码库"].Select("id="+ID); 
                int tzdm=Convert.ToInt32(dr[0]["土种代码"]);//取得该地块的土种代码 
                DataRow[] drAttribute = ds.Tables["土种信息表"].Select("编号=" + tzdm);//取得该土种代码的因子属性值 
                DataRow MyRow = ds.Tables["因子得分表"].NewRow(); 
                MyRow["id"] = ID; 
                MyRow["作物种类"] = kind; 
                for (int i = 0; i < name.Length; i++) //循环取得用户选择的因子的得分 
                { 
                    if (name[i] != null) 
                    { 
                        string cName = name[i].ToString(); 
                        string value = drAttribute[0][cName].ToString(); 
                        DataRow[] drow = ds.Tables["分值规则表"].Select("作物种类='" + kind + "'"); 
                        for (int j = 0; j <drow.Length; j++) 
                        { 
                          string str = drow[j][cName].ToString(); 
                          if (str!="") 
                          { 
                              if (str == value) 
                              { 
                                  MyRow[cName] = drow[j]["分值"]; 
                                  break; 
                                } 
                            } 
                        }            
                    } 
                    
                } 
                ds.Tables["因子得分表"].Rows.Add(MyRow); 
            }