Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有dbnull异常的自动编号和数据表_C#_Autonumber_System.data.datatable - Fatal编程技术网

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

C# 带有dbnull异常的自动编号和数据表,c#,autonumber,system.data.datatable,C#,Autonumber,System.data.datatable,我在用access数据库制作的oledbdataadapter填充的数据表上做一些工作。我偶然发现了这个错误: 原来我的表有这样的结构: ID->autonumberPK 拉佐斯文本 Asociaciones->文本 当我填充我的数据表时,所有的值都会传递给它,所有正确的值都不会有任何问题。我插入一个新行,如插入行部分所示 我这样做是因为我的pk将在创建行时插入自动编号,但显然它没有这样做,因为当我循环trought行时,我得到一个无效的强制转换异常,对象不能从DBNull强制转换为其他类型 我

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

原来我的表有这样的结构: ID->autonumberPK

拉佐斯文本

Asociaciones->文本

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

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

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

例如,假设在我的datatable中,最后一个ID是50,但在数据库中,y以前制作了一个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"]));
            }
        }

我曾经有过类似的问题。您需要做的是,一旦将此列插入表中,就可以检索它的新标识@标识。您可以通过使用RowUpdate事件来实现这一点

下面是一个与您的案例类似的快速示例,请参见页面底部:

    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;
       }
    }

@华金:很高兴我能帮忙。把它标记为一个答案;