2016-11-17 6 views
1

Совершенно новый для SQL Server и просто открыл прекрасный мир хранимых процедур - и это уже дает мне головную боль. Пришел сюда для помощи.Хранимая процедура SQL Server - C# PK - FK

Сценарий 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 таблицы и другой стол, назовем его City. CountryID, который является ПК для таблицы Country, является FK в таблице City.

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', table 'isg_cid.dbo.City'; столбец не допускает нулей. INSERT терпит неудачу.

Хорошо, это довольно очевидно - ПК не может быть NULL. Но, когда я попытался вставить в Country стол, я не должен указать идентификатор (автоматическое приращение, автоматические семена включены), так

  1. почему я должен указать это на этот раз? и
  2. как я мог это сделать?

Я полагаю, что это должно быть сделано в хранимой процедуре как-то, и я уверен, что это довольно просто решить - для кого-то с большим опытом работы с SSMS. Для меня, это хлопот, чтобы понять, что делать.

Благодарим за помощь!

+0

Можете ли вы дать создать таблицу сценариев для обеих таблиц – Surendra

+0

Возвращает идентификатор из хранимой процедуры 1 и установить в хранимой процедуре 2 – mybirthname

ответ

1

Это поле CountryID из таблицы Country, но поле CountryID из таблицы City, которая вызывает сообщение об ошибке.
Это иностранный ключ, который связывает Город со своей страной и логически не допускается без ценности, когда вы вставляете новый Город.

Таким образом, можно использовать последнее значение IDENTITY, установленное для таблицы Country, с использованием SCOPE_IDENTITY() и использовать это значение для установки CountryID в таблице City.

Вы должны изменить второй 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) 
+1

Спасибо Стиву. Копировало ваш код, но это похоже на синтаксическую ошибку. Смотрите изображение здесь: http://imgur.com/a/xM0Dz EDIT: если я удалю SELECT, он отлично работает. Спасибо! – stuckedagain