2016-11-17 24 views
1

SQL Serverにはまったく新しく、ストアドプロシージャの素晴らしい世界が見つかりました。ここに来て助けてください。SQL Serverのストアドプロシージャ - C#PK - FK

シナリオ1:テーブルを指定すると、ストアドプロシージャを作成してC#で呼び出してテーブルを作成しました。すべてが期待どおりに機能します。 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で呼び出す

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

    RETURN 

Country SQL table looks like this

ストアドプロシージャの私は今、SQLビューを作成するには、以前のCountryテーブルで構成され、別のテーブル、それをCityとしましょう。 CountryテーブルのPKであるCountryIDは、Cityテーブルの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(); 
} 

とは、問題が来ます。ボタンをクリックすると、例外が表示されます。

追加情報:カラム 'CountryID'、テーブル 'isg_cid.dbo.City'に値NULLを挿入できません。列はNULLを許可しません。 INSERTは失敗します。

さて、PKはNULLにすることはできません。しかし、私はCountryテーブルに挿入しようとしたとき、私はIDを指定する必要はありませんでした、(自動インクリメントを、自動シードがONに切り替え)、そう

  1. 私はそれをこの時間を指定しなければならないのはなぜですか?そして
  2. どうすればいいですか?

何とかストアドプロシージャで実行する必要があると思いますが、これは解決するのが簡単だと思います.SSMSの経験が豊富な人です。私にとって、何をすべきかを理解するのは面倒です。

ありがとうございました!

+0

を有する第2のSPを変更する必要がありますが、テーブル、ストアドプロシージャ1からIDを返すストアドプロシージャ2 – Surendra

+0

の両方のテーブル・スクリプトを作成し与えることができます。コードをコピーしましたが、これは構文エラーがあるようです。ここで画像を参照してください: http://imgur.com/a/xM0Dz 編集:私がSELECTを削除すると、それは完全に正常に動作します。ありがとうございました! – mybirthname

答えて

1

CountryテーブルのCountryIDフィールドではなく、エラーメッセージを表示するCityテーブルのCountryIDフィールドです。
これは、市を国と結びつけ、新しい都市を挿入するときに論理的に値なしにすることのできない外部キーです。

ので、可能なアプローチはSCOPE_IDENTITY()を使用して国のテーブルに設定された最後のIDENTITY値を読み、市テーブルにCountryIDを設定するには、この値を使用することです。

あなたは

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

おかげでスティーブに設定 – stuckedagain

関連する問題