我有一对多关系的父和子表。我所做的是我创建了一个搜索方法,用户可以从父表中找到ID,结果显示在A标签97上。然后,他们将插入子记录并使用标签中显示的结果链接两个表。所以我没有使用@@ identity做外键。所以我的问题是我所做的方法是不好的做法?因为结果在数据库中看起来很好。这是我的代码。谢谢。
Main.cs
private void btnSearch2_Click(object sender, EventArgs e)
{
myCon.Open();
cmd = new OleDbCommand("SELECT * FROM EmployMainDetails WHERE EID = @EID", myCon);
cmd.Parameters.AddWithValue("EID", textBox2.Text);
try
{
dreader = cmd.ExecuteReader();
if (dreader.Read())
{
label97.Text = dreader["EID"].ToString();
}
else MessageBox.Show("No record found");
}
catch (Exception)
{
MessageBox.Show(" No Record");
}
finally
{
myCon.Close();
}
}
private void btnJNew_Click(object sender, EventArgs e)
{
EEmployDetails.JInsert(txtJobID.Text, label97.Text, cBEmpStatus.Text, ...);
}
EmployDetails.cs
这是我的插入方法
public static void JInsert(string ejobid, string eid, string employst,... )
{
var con = GetConnection();
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = (@"INSERT INTO EmploymentDetails (EJobID, EID, EmploymentStatus,...)
VALUES(@EJobID, @EID, @EmploymentStatus, ...)");
cmd.Parameters.AddWithValue("@EJobID", ejobid);
cmd.Parameters.AddWithValue("@EID", eid);
cmd.Parameters.AddWithValue("@EmploymentStatus", employst);
....
...
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
答案 0 :(得分:1)
你的术语似乎很混乱。你说你“没有使用@@ identity完成外键”,但你使用外键,否则父表和子表之间就没有链接。
在您的情况下,EID
似乎是子表中的外键,与父表中相应的主键匹配。每个子表也可以定义自己的主键,并且该主键可以是标识列(Access称为“自动编号”字段),但这是一个不同的事情。
所以你已经在使用外键了。 Darren上面的评论指的是“参照完整性”,这是一种确保子记录始终具有相应父记录的机制。这通常称为“外键约束”,在Access中,可以通过在两个表之间创建“关系”然后选择“强制参照完整性”选项来实现