データベースを更新しようとしています。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);」で データベースを開いて更新するためのコードを含むクラスへの宣言です。