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

时间:2016-11-17 13:33:04

标签: c# sql sql-server tsql stored-procedures

SQL Server的新手,刚刚发现了存储过程的精彩世界 - 它已经让我头疼。来这里寻求帮助。

场景1 :给定一个表,我编写了一个存储过程并在C#中调用它来填充表。一切都按预期工作。

Country SQL table looks like this

存储过程:

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表和另一个表,我们称之为CityCountryID表的CountryCity表中的FK。

SQL view looks like this

存储过程:

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();
}

这就是问题所在。单击按钮,我看到一个例外:

  

附加信息:无法将值NULL插入列'CountryID',表'isg_cid.dbo.City';列不允许空值。 INSERT失败。

好的,这很明显 - PK不能为NULL。但是,当我尝试插入Country表时,我没有必要指定ID(自动增量,自动种子开启),所以

  1. 这次我为什么要指定它?和
  2. 我怎么能这样做?
  3. 我认为它应该以某种方式在存储过程中完成,并且我打赌这很容易解决 - 对于具有SSMS经验的人来说。对我来说,弄清楚要做什么很麻烦。

    感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

它不是CountryID表中的Country字段,而是CountryID表中触发错误消息的City字段。
这是将城市与其国家/地区相关联的外键,并且在插入新城市时逻辑上不能没有值。

因此,一种可能的方法是使用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)