私のプロジェクトでは、2 つのデータベース テーブルに 2 つの DataSet を設定しています。これらのデータベース テーブルを埋めるために使用している方法を以下に示します。
SqlCommand sqlCommand = new SqlCommand();
SqlCommand command;
using (SqlConnection conn = new SqlConnection(strConn))
{
using (SqlCommand cmd = new SqlCommand(strQuery, conn))
{
using (SqlCommand cmdReset = new SqlCommand("DBCC CHECKIDENT('Doctor', RESEED, 0)", conn))
{
using (SqlCommand cmdUnCheck = new SqlCommand("alter table [dbo].[Doctor] nocheck constraint all",conn))
{
using (SqlCommand cmdCheck = new SqlCommand("alter table [dbo].[Doctor] with check check constraint all",conn))
{
SqlDataAdapter da = new SqlDataAdapter(cmd);
conn.Open();
SqlTransaction sqlTransaction = conn.BeginTransaction();
cmd.Transaction = sqlTransaction;
cmdReset.Transaction = sqlTransaction;
cmdUnCheck.Transaction = sqlTransaction;
cmdCheck.Transaction = sqlTransaction;
try
{
cmdUnCheck.ExecuteNonQuery();
/*ERROR*/ cmd.ExecuteNonQuery();
cmdReset.ExecuteNonQuery();//deleting database table data
foreach (DataRow dr in ds.Tables[0].Rows) //Inserting new data into the Database table
{
command = new SqlCommand(query.createDoctorRow("Doctor",
dr[1].ToString(), dr[2].ToString(), Convert.ToInt64(dr[3]), Convert.ToInt32(dr[4])), conn, sqlTransaction);
command.ExecuteNonQuery();
}
cmdCheck.ExecuteNonQuery();
sqlTransaction.Commit();
conn.Close();
}
catch (Exception e)
{
sqlTransaction.Rollback();
throw;
}
}
}
}
}
}
上記のコードは、2 番目のデータベース テーブルが空になるまで正常に動作していましたが、データを挿入してコードを実行すると、VS でエラーが表示されます -->
DELETE ステートメントは、REFERENCE 制約 "FK_Dr_ID" と競合しました。データベース「Hospital」、テーブル「dbo.Patient」、列「Doctor_ID」で競合が発生しました。ステートメントは終了されました。
これは、外部キーがクエリの実行を制限していることは明らかですが、私は初心者で何をすべきかわからないので、あなたの助けを求めています..
上記のコードでは、このSO の回答を参照して変更を加えましたが、喜びはありません。エラーは同じポイントにまだ存在します。
オプションusing
:コード内のステートメントを減らす方法はありますか?