C# 如何在引用表中插入外键?

C# 如何在引用表中插入外键?,c#,asp.net,web-services,C#,Asp.net,Web Services,当我填写web服务数据时,我想插入外键 首先,我创建一个2表 tblpersonal: studid int (primary key identity increment) fname varchar(50) mname varchar(50) lname varchar(50) TBL合同 contactid int (primary key identity increment) emailid varchar(50) password varchar(50) contactno

当我填写web服务数据时,我想插入外键

首先,我创建一个2表

tblpersonal

studid int  (primary key identity increment)
fname varchar(50)
mname varchar(50)
lname varchar(50)
TBL合同

contactid int  (primary key identity increment)
emailid  varchar(50)
password  varchar(50)
contactno  varchar(50)
hobby  varchar(50)
address varchar(50)
countrycodenum varchar(50)
studid (foreign key tblpersonal)
问题是当填充Web服务时,没有插入出现问题的外键,请参见下图

WebService1.asmx.cs

namespace WebServiceDemo
{

    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    [System.Web.Script.Services.ScriptService]
    public class WebService1 : System.Web.Services.WebService
    {
        SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["cnn"].ConnectionString);
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string InsertData(string fname, string mname, string lname, string emailid, string password, string contactno, string hobby, string address, string countrycodenum)
        {
            cn.Open();

            var dataObject = new { fname , mname , lname , emailid , password , contactno , hobby , address , countrycodenum };

            string data = JsonConvert.SerializeObject(dataObject);

            SqlCommand cmd = new SqlCommand("insertsp_singlesp", cn);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@fname", fname);
            cmd.Parameters.AddWithValue("@mname", mname);
            cmd.Parameters.AddWithValue("@lname", lname);
            cmd.Parameters.AddWithValue("@emailid", emailid);
            cmd.Parameters.AddWithValue("@password", password);
            cmd.Parameters.AddWithValue("@contactno", contactno);
            cmd.Parameters.AddWithValue("@hobby", hobby);
            cmd.Parameters.AddWithValue("@address", address);
            cmd.Parameters.AddWithValue("@countrycodenum", countrycodenum);

            int i = cmd.ExecuteNonQuery();
            if (i > 0)
            {              
                Console.WriteLine("Insert Successfully");
            }
            else
            {              
                Console.WriteLine("Not Insert Successfully");
            }
            cn.Close();
            return data;
        }
    }
}
存储过程:insertsp_singlesp

ALTER PROCEDURE [dbo].[insertsp_singlesp] 
    @fname varchar(50),
    @mname varchar(50),
    @lname varchar(50),
    @emailid varchar(50),
    @password varchar(50),
    @contactno varchar(50),
    @hobby varchar(50),
    @address varchar(50),
    @countrycodenum varchar(50)
AS
BEGIN
   insert into tblpersonal(fname, mname, lname)values(@fname,@mname,@lname);
   insert into tblcontact(emailid, password,contactno,hobby,address,countrycodenum)values(@emailid,@password,@contactno,@hobby,@address,@countrycodenum);
END
下图为另一个表中的外键:

studid int  (primary key identity increment)
fname varchar(50)
mname varchar(50)
lname varchar(50)


请提供帮助?

您可以更改StoredProcess以捕获插入当前连接的最后一个标识值,然后使用此值设置FK值

ALTER PROCEDURE [dbo].[insertsp_singlesp] 
    @fname varchar(50),
    @mname varchar(50),
    @lname varchar(50),
    @emailid varchar(50),
    @password varchar(50),
    @contactno varchar(50),
    @hobby varchar(50),
    @address varchar(50),
    @countrycodenum varchar(50)
AS
BEGIN
   insert into tblpersonal(fname, mname, lname)values(@fname,@mname,@lname);
   declare @studid int
   SELECT @studid = SCOPE_IDENTITY();
   insert into tblcontact(
               emailid, password,contactno,hobby,
               address,countrycodenum,studid)
         values(
                @emailid,@password,@contactno,@hobby,
                @address,@countrycodenum,@studid);
END

当您插入到第二个表中时,您只是没有提供第一个表的PK。没有什么“魔法”能让SQL系统说“是的,这就是他的意思”

您没有说您正在使用什么系统,但在我看来它像SQL Server,所以我将继续使用它。您需要使用SCOPE_IDENTITY()函数获取第一次插入后生成的最后一个标识,然后在第二次插入中使用它:

BEGIN
   declare @ssi int;
   insert into tblpersonal(fname, mname, lname)values(@fname,@mname,@lname);
   -- get the identity just created
   select @ssi = scope_identity();
   -- use it in the insert
   insert into tblcontact (emailid, password, contactno, 
                          hobby, address, countrycodenum, studid)
        values (@emailid, @password, @contactno,
                @hobby, @address, @countrycodenum, @ssi);
END

你应该适当地解释你的问题。请尝试编辑解释。问题非常简单tblpersonal(studid-1011)插入另一个表tblcontact(studid是外键-这里我想插入1011)@Nish你不明白什么告诉我?很高兴能提供帮助,看看你的代码,我还想建议删除创建带有AddWithValue的参数。这很危险,Sql Server无法执行