2016-09-07 11 views
1

複数のテーブルにデータを挿入する際に助けが必要です。 - revizija複数のテーブルにデータを挿入

  • Revizija(rev_id、Broj_rev)
  • Verzija(verz_id、Broj_verz、rev_id)
  • Program(prog_id、Naziv_prog、verz_id)FKで接続

:私は3つのテーブルを持っています〜verzija,verzijaprogramski sustav。

プログラムを実行しようとすると、挿入が失敗します。

SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Database1"].ConnectionString); 
SqlCommand xp = new SqlCommand("Insert into Revizija Values(@Broj_rev)", con); 
xp.Parameters.AddWithValue("@Broj_rev", textBox5.Text); 

con.Open(); 
xp.ExecuteNonQuery(); 
con.Close(); 

SqlCommand xp1 = new SqlCommand("Insert into Verzija values(@Broj)", con); 
xp1.Parameters.AddWithValue("@Broj", textBox4.Text); 

con.Open(); 
xp1.ExecuteNonQuery(); 
con.Close(); 

SqlCommand xp4 = new SqlCommand("Insert into Program values (@Naziv_prog)", con); 
xp4.Parameters.AddWithValue("@Naziv_prog", textBox2.Text); 

con.Open(); 
xp4.ExecuteNonQuery(); 
con.Close(); 
+2

どのようなエラーが表示されますか? –

+0

rev_id、verz_id、prog_idのIDENTITYカラムはありますか? – Steve

答えて

1

あなたはRevizijaテーブルの主キーに割り当てられた値を知っておく必要がありVerzijaテーブルにデータを挿入しようと、あなたがRevizijaProgramテーブルにレコードを挿入しようとすると、同じことが起こります。

このシナリオでは、SQL Serverの機能を使用して2つのコマンドを一緒に実行し、最初の2つのコマンドのそれぞれにSQL SELECT SCOPE_IDENTITY()コマンドテキストを追加できます。 SCOPE_IDENTITYは、接続を介して割り当てられた最後のIDENTITY値の値を返します。このコマンドの結果は、ExecuteScalarを使用して読み取られ、次のコマンドの入力パラメータとして使用されます。

using(SqlConnection con = new SqlConnection(....)) 
using(SqlCommand xp = new SqlCommand(@"Insert into Revizija 
             (Broj_rev) Values(@Broj_rev); 
             SELECT SCOPE_IDENTITY()", con); 
{ 
    con.Open(); 
    xp.Parameters.AddWithValue("@Broj_rev", textBox5.Text); 
    int rev_id Convert.ToInt32(xp.ExecuteScalar()); 

    using(SqlCommand xp1 = new SqlCommand(@"Insert into Verzija 
        (Broj_verz, rev_id) values(@Broj,@rev_id); 
        SELECT SCOPE_IDENTITY()", con); 
    { 
     xp1.Parameters.AddWithValue("@Broj", textBox4.Text); 
     xp1.Parameters.AddWithValue("@rev_id", rev_id); 
     int verz_id = Convert.ToInt32(xp1.ExecuteScalar()); 

     using(SqlCommand xp4 = new SqlCommand(@"Insert into Program 
       (Naziv_prog, verz_id) values (@Naziv_prog, @verz_id)", con); 
     { 
      xp4.Parameters.AddWithValue("@Naziv_prog", textBox2.Text); 
      xp4.Parameters.AddWithValue("@verz_id", verz_id); 
      xp4.ExecuteNonQuery(); 
     } 
    } 
} 

クエリにメインエラーが修正されていることにも注意してください。 INSERT INTO文では、列名を省略すると、存在するすべてのフィールドに値を指定する必要があります(そうしないと、渡された値が一致する列に正しく割り当てられません)。クエリによって更新される列を指定してください

+0

ありがとうございます。やってみます。 – Tom

+0

処理中です。sqlconnection行でWindowsFormsApplication1.exeエラーで 'System.NullReferenceException'タイプの未処理の例外が発生しました。 – Tom

+0

まあ、_ConfigurationManager.ConnectionStrings ["Database1"]。ConnectionString_のすべてを書いたわけではありませんが、もちろんそうではなくてはなりません...そして既にそれを行った場合は、app.configにセクションDatabase1という名前の1つのエントリを持つConnectionString – Steve

関連する問題