Autonumber и datatable с исключением dbnull - PullRequest
0 голосов
/ 03 сентября 2011

Я работал над таблицей данных, которую я заполнил oledbdataadapter, сделанным из базы данных доступа.и я наткнулся на эту ошибку:

Оказывается, что моя таблица имеет такую ​​структуру: ID -> autonumber (PK)

lazos_> text

Asociaciones-> text

и когда я заполняю свою таблицу данных, все значения передаются ей без проблем со всеми правильными значениями.Я вставляю новую строку, как показано в части «вставка строки».

Я делаю это, полагая, что мой pk будет вставлять «autonumber» при создании строки, но, очевидно, он этого не делает, потому что, когда я зацикливаюсьстроки, которые я получаю «недопустимое исключение приведения» с Объектом, не могут быть преобразованы из DBNull в другие типы. "

Я МОГУ ВСТАВИТЬ значение столбца id в столбец, но когда я обновляю свой dt в моей базе данных, это не таксоздать ошибку, потому что у меня нет возможности узнать, какая последняя строка была создана? или, например, я?

, скажем, в моей базе данных последний идентификатор равен 50, но в базе данных y ранее сделалзапись с идентификатором "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"]));
            }
        }

1 Ответ

0 голосов
/ 03 сентября 2011

У меня когда-то была похожая проблема. Вам нужно только получить новый идентификатор @@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;
       }
    }
...