有一DataTable,其中一列ID是自动增量的主键。怎样插入一行新数据?每次插入都报ID列不能为Null,唯一等。

解决方案 »

  1.   

     DataTable dt = new DataTable();
            DataColumn dc = new DataColumn("autoId", typeof(Int32));
            dc.AutoIncrement = true;
            dc.AutoIncrementSeed = 0;
            dc.AutoIncrementStep = 2;
            dt.Columns.Add(dc);        DataColumn dc2 = new DataColumn("Name", typeof(string));
            dt.Columns.Add(dc2);
            DataRow dr = dt.NewRow();
            dr["Name"] = "aaaa";
            dt.Rows.Add(dr);调试通过  没有问题 
      

  2.   

    谢谢上面各位指点。但是我是忽略ID列的赋值,插入时依然报错,程序如下:private void UpdateTable()
            {
                DataSet dsUpdate = ConnDB.ExcCommReturnDSet("Select * From BledAnimalCode");
                dsUpdate.Tables[0].PrimaryKey = new DataColumn[] { dsUpdate.Tables[0].Columns["BledID"] };
                //dsUpdate.Tables[0].Columns["BledID"].Unique = true;
                DataRow[] CheckedRows = new DataRow[this.grdCheckAnimals.Rows.Count];  //使用DataTable.NewRow新建一个DataRow;
                int ic = 0; //Checked Bled 的行索引。
                for (int i = 0; i < this.grdCheckAnimals.Rows.Count; i++ )
                {
                    if ((int)grdCheckAnimals.Rows[i].Cells["Bled"].Value == 1)
                    {
                        CheckedRows[ic] = dsUpdate.Tables[0].NewRow();    //使用DataTable.NewRow新建一个DataRow;
                        if (this.grdCheckAnimals.Rows[i].Cells["BledID"].Value != DBNull.Value)
                        {
                            CheckedRows[ic][0] = this.grdCheckAnimals.Rows[i].Cells["BledID"].Value;  //填充DataRow每个列的字段;
                           }                    CheckedRows[ic][1] = this.grdCheckAnimals.Rows[i].Cells["CatalogID"].Value;  //填充DataRow每个列的字段;
                        CheckedRows[ic][2] = this.grdCheckAnimals.Rows[i].Cells["Animal"].Value;  //填充DataRow每个列的字段;
                        CheckedRows[ic][3] = this.grdCheckAnimals.Rows[i].Cells["BledDate"].Value;  //填充DataRow每个列的字段;
                        CheckedRows[ic][4] = this.grdCheckAnimals.Rows[i].Cells["PooledDate"].Value;  //填充DataRow每个列的字段;
                        CheckedRows[ic][5] = this.grdCheckAnimals.Rows[i].Cells["Comments"].Value;  //填充DataRow每个列的字段;
                        if (this.grdCheckAnimals.Rows[i].Cells["BledID"].Value != DBNull.Value)   //修改行数据;
                        {
                            dsUpdate.Tables[0].BeginLoadData();
                            dsUpdate.Tables[0].LoadDataRow(CheckedRows[ic].ItemArray, false);
                            dsUpdate.Tables[0].EndLoadData();
                        }
                        else
                        {
                            dsUpdate.Tables[0].Rows.Add(CheckedRows[ic]); //将DataRow添加到DataTable的Rows集合——插入新行数据;
                               //上面这句报错:Column 'BledID' does not allow nulls.
                        } 
                        ic++;
                    }
                }
                ConnDB.UpdateTable("Select * From BledAnimalCode", dsUpdate.Tables[0]);
            }我解释一下程序的大致情况:首先从DataGridView网格控件中筛选CheckedBox选中的行保存。要保存的行有些是数据库里已有的,更新即可。另一些行是数据库没有的,插入数据库。还有就是数据库有的行但DataGridView没有选中,就要删除数据库的这个行,这条还没写。现解决上面的问题。报错是在
                            dsUpdate.Tables[0].Rows.Add(CheckedRows[ic]); //Column 'BledID' does not allow nulls.请高手点拨,再次谢谢!
      

  3.   

    BledID列你设定了不允许为空啊,但是你并没有处理它为空的情况啊。你只处理了它不为空的情况
    if (this.grdCheckAnimals.Rows[i].Cells["BledID"].Value != DBNull.Value) 
                        { 
                            CheckedRows[ic][0] = this.grdCheckAnimals.Rows[i].Cells["BledID"].Value;  //填充DataRow每个列的字段; 
                          } 
    else 呢?
      

  4.   

    我的想法同上面几位一样,认为BledID为DBNull.Value,插入时DataTable自动填入增量值。这种想法大概是错的,但是我不知道else之后该如何写?
      

  5.   

    Select * From BledAnimalCode这句不要查询全部的出来,不要包含那个自增的列,在添加数据行的时候,不用管。
      

  6.   

    Select 字段列表里不列出BledID资增列,我有些更新的行怎么处理?SqlDataAdapter.Update();会把我本意要更新的行也变成插入了。是吗?
      

  7.   

    是啊,难道你的主键是BledID列吗?那你在数据库设计的时候就不要设计成自增的,然后在插入数据行时给它赋值,让其自增;如果你硬要设计成自增的话,那就设置其它的列为主键咯。
      

  8.   

    "  dsUpdate.Tables[0].Rows.Add(CheckedRows[ic]); //Column 'BledID' does not allow nulls. "
    数据库不允许为空 你就不能插空的数据阿
    else之后的办法是什么呢??
    如果是测试环境 就随便给个值或者改一下数据库的设置