none
(Sumber: milist DOTNET) error konfik PK dan FK RRS feed

  • Pertanyaan

  • Dear all. Mau tanya..

     

    Ceritanya begini

     

    Saya ada dua tabel   Tabel A (induk) dan Tabel B (anak)  di tabel A ada primary key dan di tabel B ada FK yang saling terhubung.

     

    Di method save data. Prosedurnya kurang lebih urutannya seperti ini

     

    public void simpan()

    {

    Simpan data ke table A

     

    if (ada data untuk tabel b)

    {

        simpan data ke tabel B;

     

    }

    }

     

    Tapi anehnya, tiap kali kali mo nyimpen data ke tabel B, selalu ada error conflik PK dan FK antara tabel A dan B.

    seolah tabel B tidak menemukan PK di tabel A.

    Sudah aku trace, pada proses simpan ke tabel A semuanya berjalan lancar gak ada error jadi seharusnya data di tabel A udah masuk kan?, karena dia dijalankan lebih dulu.

    tapi pada proses kedua, simpan ke tabel B, muncul error, tidak menemukan PK di tabel A.

     

    aku dah coba, queri 1 dan queri 2 aku gabungin dalam satu storeprocedur dan berjalan lancar. Tapi karena data untuk tabel B tidak selalu ada, jadi aku pisahin kuerinya.

     

    Apa ada cara setelah simpan ke tabel A, database nya di refresh, baru simpan ke tabel B?

     

    nb: untuk prosedur dbnya aku masih pake Ado.net , dengan db sqlserver 2008 R2

     

     

    terima kasih

     


    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Selasa, 22 November 2011 06.42
    Moderator

Jawaban

  • Kemungkinan blm di commit datanya.

    Kalau pakai table adapter, coba taruh code ini seperti di file *.cs nya


    partial class ReservationsTableAdapter
    {
        public void BeginTransaction(SqlTransaction tran)
        {
            Connection = tran.Connection;
            if(_commandCollection != null)
                foreach (SqlCommand cmd in _commandCollection)
                {
                    if (cmd != null)
                        cmd.Transaction = tran;
                }
            if ((Adapter.InsertCommand != null))
            {
                Adapter.InsertCommand.Transaction = tran;
            }
            if ((Adapter.DeleteCommand != null))
            {
                Adapter.DeleteCommand.Transaction = tran;
            }
            if ((Adapter.UpdateCommand != null))
            {
                Adapter.UpdateCommand.Transaction = tran;
            }
            if ((Adapter.SelectCommand != null))
            {
                Adapter.SelectCommand.Transaction = tran;
            }
        }
    }

    using System.Data.SqlClient;

    private SqlConnection _conn = null;
    private SqlTransaction _tran = null;

    private ReservationsTableAdapter _adapterReservation = null;
    private O.DAL.ReservationDAL _reservationDAL = null;
     
    protected ReservationsTableAdapter AdapterReservation
    {
        get
        {
            if (_adapterReservation == null)
                _adapterReservation = new ReservationsTableAdapter();
            return _adapterReservation;
        }
    }
           
    // untuk commit data nya ke table yg di insert karena biasanya data masih di memory blm masuk ke database
    public void CommitReservations()
    {
        AdapterReservation.BeginTransaction(_tran);
        AdapterReservation.Update(ReservationDAL.Reservations);
    }

    //Code ini taruh di action button nya atau apa aja untuk invoke
    try
    {
        //Reservation
        CommitReservations();
       
        _tran.Commit();
        _conn.Close();   
    }
    catch (SqlException ex)
    {
        _tran.Rollback();
        _conn.Close();
        ReservationDAL.RejectChanges();
        throw new ApplicationException(ex.Message);
    }


    Kalau ada yang kurang tinggal modifikasi aja sesuai dengan kebutuhan.

    Semoga bisa membantu.

    Dijawab oleh: Teofilus Tobing

     


    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Selasa, 22 November 2011 06.44
    Moderator

Semua Balasan

  • Pakai Transaction, bisa code atau bisa dibungkus dlm SP untuk kedua INSERT. Kalau masalah datanya B bisa ada atau nggak ada, kan tinggal di TRY CATCH

     
    Dijawab oleh: Hendra


    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Selasa, 22 November 2011 06.42
    Moderator
  • Kemungkinan blm di commit datanya.

    Kalau pakai table adapter, coba taruh code ini seperti di file *.cs nya


    partial class ReservationsTableAdapter
    {
        public void BeginTransaction(SqlTransaction tran)
        {
            Connection = tran.Connection;
            if(_commandCollection != null)
                foreach (SqlCommand cmd in _commandCollection)
                {
                    if (cmd != null)
                        cmd.Transaction = tran;
                }
            if ((Adapter.InsertCommand != null))
            {
                Adapter.InsertCommand.Transaction = tran;
            }
            if ((Adapter.DeleteCommand != null))
            {
                Adapter.DeleteCommand.Transaction = tran;
            }
            if ((Adapter.UpdateCommand != null))
            {
                Adapter.UpdateCommand.Transaction = tran;
            }
            if ((Adapter.SelectCommand != null))
            {
                Adapter.SelectCommand.Transaction = tran;
            }
        }
    }

    using System.Data.SqlClient;

    private SqlConnection _conn = null;
    private SqlTransaction _tran = null;

    private ReservationsTableAdapter _adapterReservation = null;
    private O.DAL.ReservationDAL _reservationDAL = null;
     
    protected ReservationsTableAdapter AdapterReservation
    {
        get
        {
            if (_adapterReservation == null)
                _adapterReservation = new ReservationsTableAdapter();
            return _adapterReservation;
        }
    }
           
    // untuk commit data nya ke table yg di insert karena biasanya data masih di memory blm masuk ke database
    public void CommitReservations()
    {
        AdapterReservation.BeginTransaction(_tran);
        AdapterReservation.Update(ReservationDAL.Reservations);
    }

    //Code ini taruh di action button nya atau apa aja untuk invoke
    try
    {
        //Reservation
        CommitReservations();
       
        _tran.Commit();
        _conn.Close();   
    }
    catch (SqlException ex)
    {
        _tran.Rollback();
        _conn.Close();
        ReservationDAL.RejectChanges();
        throw new ApplicationException(ex.Message);
    }


    Kalau ada yang kurang tinggal modifikasi aja sesuai dengan kebutuhan.

    Semoga bisa membantu.

    Dijawab oleh: Teofilus Tobing

     


    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Selasa, 22 November 2011 06.44
    Moderator