带有dbnull异常的自动编号和数据表

本文关键字:编号 数据表 dbnull 异常 带有 | 更新日期: 2023-09-27 18:07:20

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

结果是我的表有这样的结构:ID ->自动编号(PK)

lazos_>文本

Asociaciones ->

文本

,当我填充数据表时,所有的值都传递给它,没有任何问题,所有的值都是正确的。我插入一个新行,就像"插入行"部分所示。

我这样做是假设我的pk将插入行创建上的"自动编号",但显然它没有这样做,因为当我循环遍历行时,我得到一个对象不能从DBNull转换到其他类型的"无效强制转换异常"。"

我可以插入一个id值的列,但当我更新我的dt到我的数据库不会创建一个错误,因为我没有办法知道哪是最后一行创建?是吗?

例如,让我们说在我的数据表的最后一个ID是50,但在数据库y以前做了一个记录ID"51",但随后擦除它,如果我插入51基于我的dt信息,它会给一个错误的权利?

    //// 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"]));
            }
        }

带有dbnull异常的自动编号和数据表

我曾经有过类似的问题。您需要做的是,一旦将该列插入到表中,您将检索该列的新标识@@IDENTITY。您可以使用RowUpdated event。

下面是来自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;
       }
    }