SQL Server存储过程- c# PK - FK

本文关键字:PK FK SQL 存储过程 Server | 更新日期: 2023-09-27 18:18:29

对SQL Server很陌生,刚刚发现存储过程的奇妙世界——这已经让我头疼了。我来这里寻求帮助。

场景1:给定一个表,我编写了一个存储过程,并在c#中调用它来填充表。一切正常

国家SQL表如下所示

存储过程:

CREATE PROCEDURE [dbo].[InsertRecord2]
    @countryname nvarchar(64),
AS
    INSERT INTO Country(CountryName)
    VALUES (@countryname)
    RETURN

在c#中调用

private void button1_Click(object sender, EventArgs e)
{
    readonly SqlConnection _connection = new SqlConnection(@"Data Source=REXGBASQLP042;Initial Catalog=isg_cid;Integrated Security=True");
    _connection.Open();
    SqlCommand _command = _connection.CreateCommand();
    _command.CommandType = CommandType.StoredProcedure;
    _command.CommandText = "InsertRecord2";
    _command.Parameters.Add("@countryname", SqlDbType.NVarChar).Value = countryname.Text;
    _command.ExecuteNonQuery();
    _connection.Close();
}

场景2:我现在想创建一个SQL视图,由前面的Country表和另一个表组成,我们称之为CityCountryIDCountry表中的PK,是City表中的FK。

SQL视图如下图

存储过程:

CREATE PROCEDURE [dbo].[InsertRecord2]
    @countryname nvarchar(64),
    @cityname nvarchar(64)
AS
    INSERT INTO Country(CountryName)
    VALUES (@countryname)
    INSERT INTO City(CityName)
    VALUES (@cityname)
    RETURN

在c#中调用:

private void button1_Click(object sender, EventArgs e)
{
    readonly SqlConnection _connection = new SqlConnection(@"Data Source=REXGBASQLP042;Initial Catalog=isg_cid;Integrated Security=True");
    _connection.Open();
    SqlCommand _command = _connection.CreateCommand();
    _command.CommandType = CommandType.StoredProcedure;
    _command.CommandText = "InsertRecord2";
    _command.Parameters.Add("@countryname", SqlDbType.NVarChar).Value = countryname.Text;
    _command.Parameters.Add("@cityname", SqlDbType.NVarChar).Value = cityname.Text;
    _command.ExecuteNonQuery();
    _connection.Close();
}

问题来了。点击按钮,我看到一个异常:

附加信息:不能在表isg_cid.dbo.City的列'CountryID'中插入NULL值;列不允许为空。插入失败。

好的,这很明显- PK不可能是NULL。但是,当我试图插入到Country表时,我不必指定ID(自动增量,自动种子开关),所以

  1. 为什么我这次必须指定它?和
  2. 我怎么能这么做?

我想它应该以某种方式在存储过程中完成,我敢打赌这很容易解决-对于具有丰富SSMS经验的人来说。对我来说,弄清楚该做什么是件麻烦事。

谢谢你的帮助!

SQL Server存储过程- c# PK - FK

触发错误消息的不是Country表中的CountryID字段,而是City表中的CountryID字段。
这是连接城市与其国家的外键,当插入新城市时,逻辑上不能让它没有值。

因此,一种可能的方法是使用SCOPE_IDENTITY()读取Country表的最后一个IDENTITY值,并使用该值设置City表中的CountryID。

你需要用

改变第二个SP
CREATE PROCEDURE [dbo].[InsertRecord2]
@countryname nvarchar(64),
@cityname nvarchar(64)
AS
    INSERT INTO Country(CountryName) VALUES (@countryname)
    INSERT INTO City(CountryID, CityName)
    VALUES (SCOPE_IDENTITY(), @cityname)