2016-07-12 91 views
0

我有一个窗体可以将一个所有者和一个宠物的数据输入到数据库中。宠物拥有所有者ID的外键,所有者和宠物的数据填写在同一表格中,那么如果ownerID尚未在数据库中设置,我如何在宠物对象中设置所有者ID?或者只是我必须首先在数据库中设置所有者?C#设置外键

Owner属性Pet

private int32 idOwner; 
private String name; 

类属性;

private int32 Pet; 
private int32 idOwner; // foreign key 
private String name; 

形式

Owner owner = new Owner(); 
owner.Name = this.ownerNameTxt.Text.Trim(); 
OwnerService.addOwner(owner); // add owner to database 

Pet pet = new Pet(); 
pet.name = this.petNameTxt.Text.Trim(); 
pet.idOwner = ???????? 
+0

你在使用ADO.NET或实体框架? – Rahul

+0

emmm你让我在那里,林不知道,我只是在解决方案中创建一个服务文件夹,并执行连接方法.......我使用System.Data.SqlClient ....我不知道这是否告诉你任何事情。 – DedalusNine

+0

'私人所有者_Owner;'你应该把它添加到'宠物'类。我认为这会有所帮助。 – DhavalR

回答

1

所以你有大干快上插入生成的标识列idOwner和你想要设置ID在Pet对象。然后,您需要修改OwnerService.addOwner方法,以便从数据库中选择生成的ID并更新所有者对象。

private void addOwner(owner) 
{ 
    // your current logic here but modify to 
    // add ;SELECT SCOPE_IDENTITY(); at the end of your insert query. 
    // and store it in a local int. eg int ownerID = (int)cmd.ExecuteScalar(); 

    owner.idOwner = ownerID; 
} 

然后你的表单代码:

Owner owner = new Owner(); 
owner.Name = this.ownerNameTxt.Text.Trim(); 
OwnerService.addOwner(owner); // add owner to database 

Pet pet = new Pet(); 
pet.name = this.petNameTxt.Text.Trim(); 
pet.idOwner = owner.idOwner; 

文档为SCOPE_IDENTITY (Transact-SQL)

返回插入标识列在 同一范围内的最后一个标识值。范围是一个模块:存储过程,触发器,函数或批处理。因此,如果 它们处于相同的存储过程,函数或批处理中,则两个语句在相同的范围内。

+0

是否这样? public static void addOwner(Owner owner) { String sql =“INSERT INTO Owner(name)” +“VALUES('”+ owner.Name +“')”; SELECT SCOPE_IDENTITY(ownerID); \t owner.idOwner = ownerID; connect(); SqlCommand cmd = new SqlCommand(sql,connection); cmd.ExecuteNonQuery(); disconnect(); } – DedalusNine

+0

@DedalusNine这没有c#语法错误。就像这样:'字符串SQL = “INSERT INTO所有者(名称)” + “VALUES( '” + owner.Name + “'); SELECT SCOPE_IDENTITY();”' – user3185569

+0

@DedalusNine,那么你需要的ID设置为变量:'int ID =(int)cmd.ExecuteScalar();'then'owner.idOwner = ID;'它清楚了吗? – user3185569