Получить значение идентичности из типизированного набора данных - PullRequest
1 голос
/ 23 октября 2011

Я получил набор данных в моей форме.Использование BindingSource для обхода строк, вставки и обновления записей.

Все в порядке, но мне нужно значение идентификатора вставленных записей для генерации строки для моего поля GeneratedCode в моей таблице.

После получения этого значения я отправлю значение своему CodeGen()метод и сгенерировать строку, и обновить поле CodeGen той же строки с этим значением.

Я использую базу данных Access.Я знаю, что это @@Identity вещь для Access, но как я могу ее использовать?Я не хочу использовать OleDbCommand или что-то подобное.

Как я могу это сделать?

  string GenCode(int pCariId)
    {
        string myvalue;
        int totalDigit = 7;

        myvalue = "CR" + pCariId.ToString();
        for (int digit = myvalue.Length; digit <= totalDigit - 1; digit++)
        {
            myvalue = myvalue.Insert(2, "0");

        }
        return myvalue;
    }

private void dataNavigator_ButtonClick(object sender, NavigatorButtonClickEventArgs e)
    {
         switch (e.Button.ButtonType)
        {
            case NavigatorButtonType.EndEdit:
                try
                {

                    this.Validate();

                    if (KaydetFlags == 1)
                    {
                        this.bndCariKayit.EndEdit();

                        datagate_muhasebeDataSet.TB_CARI.Rows[datagate_muhasebeDataSet.Tables["TB_CARI"].Rows.Count - 1]["INS_USR"] = 0;
                        datagate_muhasebeDataSet.TB_CARI.Rows[datagate_muhasebeDataSet.Tables["TB_CARI"].Rows.Count - 1]["INS_TRH"] = DateTime.Now;
                        XtraMessageBox.Show("Yeni Cari Kaydı Tamamlandı.");
                        KaydetFlags = 0;

                    }
                    else
                    {

                        DataRowView currentRow = (DataRowView)bndCariKayit.Current;
                        currentRow.Row["UPD_USR"] = "0";
                        currentRow.Row["UPD_TRH"] = DateTime.Now;
                        XtraMessageBox.Show("Cari Kaydı Güncellendi.");
                        this.bndCariKayit.EndEdit();
                    }
                    this.tB_CARITableAdapter.Update(datagate_muhasebeDataSet.TB_CARI);


                }
                catch (System.Exception ex)
                {
                    XtraMessageBox.Show("Kayıt İşlemi Başarısız. Lütfen Tekrar Deneyiniz.");
                }
                break;

1 Ответ

0 голосов
/ 21 мая 2012

Согласно документации вы должны использовать RowUpdated метод вашего TableAdapter

private static void OnRowUpdated(
  object sender, OleDbRowUpdatedEventArgs e)
{
    // Conditionally execute this code block on inserts only.
    if (e.StatementType == StatementType.Insert)
    {
        OleDbCommand cmdNewID = new OleDbCommand("SELECT @@IDENTITY",
            connection);
        // Retrieve the Autonumber and store it in the CategoryID column.
        e.Row["CategoryID"] = (int)cmdNewID.ExecuteScalar();
        e.Status = UpdateStatus.SkipCurrentRow;
    }
}

Другой вариант, который я на самом деле использую, заключается в создании Select запроса, который простополучает максимальное значение от вас id столбец:

SelectLastAddedId:
SELECT MAX(id) FROM obmiar

Просто установите режим выполнения запроса на scalar, и вы можете ссылаться на него в своем коде как int lastId = TableAdapter.SelectLastAddedId()

...