0

我在一个数据表上做一些工作,我填充了一个由访问数据库制成的 oledbdataadapter。我偶然发现了这个错误:

原来我的表有这样的结构: ID --> autonumber(PK)

lazos_>文本

协会->文本

当我填写我的数据表时,所有值都传递给它,所有正确值都没有任何问题。我插入一个新行,如“插入行”部分所示。

我这样做是因为我的 pk 将在行创建时插入“自动编号”,但显然它没有这样做,因为当我循环处理行时,我得到一个“无效的强制转换异常”,其中一个对象无法从 DBNull 强制转换为其他类型。”

我可以在列中插入一个 id 值,但是当我将我的 dt 更新到我的数据库时,它不会产生错误,因为我无法知道最后一行是创建的吗?或者是吗?

例如,假设在我的数据表中,最后一个 ID 是 50,但是在数据库上,你之前用 id “51”创建了一条记录,但后来删除了它,如果我根据我的 dt 信息插入 51,它会给出错误吗?

    //// INSERT ROW
    DataRow newRow = Tabla_Cods_Proy.NewRow();
    newRow["Lazos"] = textBox1.Text ;
    newRow["Asociaciones"] = textBox2.Text;
    Tabla_Cods_Proy.Rows.Add(newRow);
    MessageBox.Show("Enhorabuena!");


//CHECK ID's            
    for (int i = 0; i < Tabla_Cods_Proy.Rows.Count; i++)
    {
        if (Tabla_Cods_Proy.Rows[i].RowState != DataRowState.Deleted)
        {
            if (Tabla_Cods_Proy.Rows[i]["Lazos_asociados"].ToString() == "")
            {

                listBox7.Items.Add(Tabla_Cods_Proy.Rows[i]["Cod_Cliente"]);
                listBox8.Items.Add(Tabla_Cods_Proy.Rows[i]["Cod_Inelectra"]);
                ID_Cods_Proy_Sin_Asociar.Add(Convert.ToInt32(Tabla_Cods_Proy.Rows[i]["ID"]));

            }
            else
            {
                listBox3.Items.Add(Tabla_Cods_Proy.Rows[i]["Cod_Cliente"]);
                listBox4.Items.Add(Tabla_Cods_Proy.Rows[i]["Cod_Inelectra"]);
                ID_Cods_Proy_Asociados.Add(Convert.ToInt32(Tabla_Cods_Proy.Rows[i]["ID"]));
            }
        }
4

1 回答 1

0

我曾经有过类似的问题。您需要做的是,在将其插入 table 后检索该列的新标识@@IDENTITY。您可以通过使用RowUpdated事件来做到这一点。

这是来自MSDN 页面的快速示例(与您的情况类似,请参见页面底部):

    public static void Main() 
    {
       //...connecting to access db and getting data to datatable...
       // ...
       // Adding a new row to datatable.
       DataRow newRow = catDS.Tables["Categories"].NewRow();
       newRow["CategoryName"] = "New Category";
       catDS.Tables["Categories"].Rows.Add(newRow);

       // Include an event to fill in the Autonumber value.
       catDA.RowUpdated += new OleDbRowUpdatedEventHandler(OnRowUpdated);

    }

    protected static void OnRowUpdated(object sender, OleDbRowUpdatedEventArgs args)
    {
       // Include a variable and a command to retrieve the identity value from the Access database.
       int newID = 0;
       OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", nwindConn);

       if (args.StatementType == StatementType.Insert)
       {
          // Retrieve the identity value and store it in the CategoryID column.
          newID = (int)idCMD.ExecuteScalar();
          args.Row["CategoryID"] = newID;
       }
    }
于 2011-09-03T16:54:39.180 回答