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
表和另一个表组成,我们称之为City
。CountryID
是Country
表中的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(自动增量,自动种子开关),所以
- 为什么我这次必须指定它?和
- 我怎么能这么做?
我想它应该以某种方式在存储过程中完成,我敢打赌这很容易解决-对于具有丰富SSMS经验的人来说。对我来说,弄清楚该做什么是件麻烦事。
谢谢你的帮助!
触发错误消息的不是Country
表中的CountryID
字段,而是City
表中的CountryID
字段。
这是连接城市与其国家的外键,当插入新城市时,逻辑上不能让它没有值。
因此,一种可能的方法是使用SCOPE_IDENTITY()读取Country表的最后一个IDENTITY值,并使用该值设置City表中的CountryID。
你需要用
改变第二个SPCREATE 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)