0

データベースを更新しようとしています。1行だけ追加しても問題ありません。しかし、値が変更されたデータセットでデータベースを更新すると、エラーが発生します。

`System.Data.DBConcurrencyException: 同時実行違反: UpdateCommand は、予想される Y レコードのうち X に影響を与えました。(オランダ語で申し訳ありません。英語版のエラーをできるだけ早く見つけます。)

internal void updateDataSet(DataSet ds1)
    {
        using (SqlConnection _con = new SqlConnection("server=(local)\\SQLExpress;database=Alarmen;integrated Security=SSPI;"))
        {
            openConnection(_con);
            log.Info("Database wordt geupdate");
            try
            {

                var con = new SqlConnection(connectionString);
                var adapter = new SqlDataAdapter("SELECT * FROM dbo.tbl_alarmen", con);
                new SqlCommandBuilder(adapter);

                //
                // Fill the DataAdapter with the values in the DataTable.
                //
                adapter.Fill(ds1, "Alarmen");
                //
                // Open the connection to the SQL database.
                //
                //con.Open();
                //
                // Insert the data table into the SQL database.
                //
                adapter.Update(ds1, "Alarmen");

                log.Info("Database geupdate van ds1");
            }
            catch (Exception err)
            {
                log.Info("Database updaten mislukt " + err);
            }
            //closeConnection(_con);
        } 

    string sql = "SELECT * FROM tbl_alarmen";
    SqlCommand _cmd;
    SqlDataAdapter _dap;

    internal void openConnection(SqlConnection _con)
    {
        log.Info("Database wordt geopend");

        try
        {
            _con.Open();
        }
        catch (Exception ex)
        {
            log.Info("Database kon niet geopend worden " + ex);
        }

    }

    internal void closeConnection(SqlConnection _con)
    {
        log.Info("Database wordt gesloten");
        try
        {
            _con.Close();
        }
        catch (Exception ex)
        {
            log.Info("Database sluiten mislukt " + ex);
        }

    }

try/catch が奇妙であることはわかっています。今のところ、問題が表示される場所を簡単に確認できます。リリース前にこれを変更します。

データテーブルを埋めるコードの背後にある情報をいくつか紹介します。ステータス == アクティブの場合、それは新しいアラームであることを意味します。else ステートメントでは、ステータスを更新する必要がある既存のアラームであることを意味します。

if (Status == "Active")
            {
                log.Info("Nieuw Alarm met " + AlarmName + " " + InstanceID + " " + Status + " " + VMSID);
                DataRow dRow = ds1.Tables["Alarmen"].NewRow();
                dRow[0] = ds1.Tables["Alarmen"].Rows.Count + 1;//Creating the primary key.
                dRow[1] = VMSID;
                dRow[2] = InstanceID;
                dRow[3] = AlarmName;
                dRow[4] = Priority;
                dRow[5] = TriggerTime;
                dRow[6] = Source;
                dRow[7] = TriggerEvent;
                dRow[8] = Status;
                dRow[9] = AckType;
                dRow[10] = AckBy;
                dRow[11] = AckTime;
                dRow[12] = CreationTimeStamp;
                dRow[13] = PropagationLevel;
                dRow[14] = AlarmRunningState;
                dRow[15] = Destination;
                dRow[16] = AlarmContext;
                dRow[17] = AlarmGuid;
                ds1.Tables["Alarmen"].Rows.Add(dRow);

                interf.nieuwAlarm("Nieuw alarm ", dRow);
            }
            else
            {
                bool containTest = false;
                log.Info("Status is not active " + Status);
                for (int i = 0; i < ds1.Tables["Alarmen"].Rows.Count; i++)
                {
                    DataRow dRow = ds1.Tables["Alarmen"].Rows[i];
                    string id = dRow[2].ToString();
                    string vms = dRow[1].ToString();
                    if (vms.Contains(VMSID) && id.Contains(InstanceID))
                    {
                        containTest = true;

                        dRow[8] = Status;
                        dRow[10] = AckBy;
                        dRow[11] = AckTime;
                        ds1.Tables["Alarmen"].Rows[i].ItemArray[8] = Status;
                        ds1.Tables["Alarmen"].Rows[i].ItemArray[10] = AckBy;
                        ds1.Tables["Alarmen"].Rows[i].ItemArray[11] = AckTime;
                        interf.changedAlarm("Veranderd alarm", dRow);
                    }
                }
                if (containTest == false)
                {
                    log.Info("Onbekend Alarm is acknowledged " + InstanceID + " " + VMSID);

                }
                //Log er in zetten mocht het alarm niet voorkomen in de database
            }

            dc.updateDataSet(ds1);

「dc.updateDataSet(ds1);」で データベースを開いて更新するためのコードを含むクラスへの宣言です。

4

0 に答える 0