2011-09-02 2 views
6

を使用して複数のテーブルにデータを挿入、私は次のことを行うための標準/最良の方法であるかを知りたいと思います:は、Webフォーム

私はasp.netでフォームのWebアプリを持っているし、C#

を使用してユーザーはフォームにデータを入力してINSERTをクリックすると、4つの異なる表にデータが挿入されます。

フィールドは、次のとおりです。

primarykey, animal, street, country 

フォームは、複数の動物、複数の街や主キーごとに複数の国が可能になります。私はこのようなデータがある場合ので、私はどのように全体の損失によ

table1: 
1,rhino 
1,cat 
1,dog 

table2: 
1,luigi st 
1, paul st 

table3: 
1,russia 
1,israel 

質問

  1. [1],[rhino,cat,dog],[luigi st, paul st], [russia,israel] 
    

    を私はそれがこのようなテーブルに挿入必要これをする。私はちょうど1つのテーブルとプライマリキーごとに1つのデータのセットを持っていた場合、私はちょうどInsertQueryを使用し、このように行うだろうが、それは複数のテーブルですので、これを行う方法がわからないのですか?

  2. ユーザーが複数の値を入力できるようにするにはどのようなコントロールを使用しますか?現在、私はテキストボックスを使用していて、セミコロンで項目を区切ることを考えていますが、それはおそらく正しい方法ではありません。

+0

(1)の場合:トランザクションを使用できます。この回答を参照してください:http://stackoverflow.com/questions/2044467/how-to-update-two-tables-in-one-statement-in-sql-server-2005/2044520#2044520 –

答えて

3

私はちょうどこのようなSQL文を渡すことができるようにあなたは、SQL 2008の新しい複数行INSERT文を利用することをお勧めしたかった。「あなたのSqlCommandオブジェクトへ

INSERT INTO table1(id,animal_name) values (1,cat),(1,dog),(1,horse)... 

が、私はドンSQLインジェクション攻撃の犠牲になることなくそのような声明を作成する方法を知っています。 enter image description here

enter image description here

そして、あなたのDataTable型定義と一致するC#でのDataTable構築:

DataTable t = new DataTable(); 
t.Columns.Add("id"); 
t.Columns.Add("animal_name"); 
foreach(var element in your animals_list) 
{ 
    DaraRow r = t.NewRow(); 
    r.ItemArray = new object[] { element.id, element.animal_name }; 
    t.Rows.Add(r); 
} 

// Assumes connection is an open SqlConnection. 
using (connection) 
{ 
    // Define the INSERT-SELECT statement. 
    string sqlInsert = "INSERT INTO dbo.table1 (id, animal_name) SELECT nc.id, nc.animal_name FROM @animals AS nc;" 

    // Configure the command and parameter. 
    SqlCommand insertCommand = new SqlCommand(sqlInsert, connection); 
    SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@animals", t); 
    tvpParam.SqlDbType = SqlDbType.Structured; 
    tvpParam.TypeName = "dbo.AnimalTable"; 

    // Execute the command. 
    insertCommand.ExecuteNonQuery(); 
} 

Read more here

別の方法としては、SQLデータベース内のデータ・テーブル・タイプを定義することです。

ストアドプロシージャに精通している場合、以前の提案と同じですが、ストアドプロシージャを持つ場合は、DataTableをパラメータとして受け取ります。

上記のいずれにも該当しない場合は、ConnectionオブジェクトからSqlTranscationを作成し、適切なテーブルにレコードを挿入して最後にトランザクションをコミットする各データセットの各行を繰り返します。 Example here.

+0

ありがとうそのコードを置く? INSERTINGイベントで? –

2

フロントエンドのチェックボックスを使用します。ユーザーデータを保存するためのサービス/リポジトリがあります。次のようなものがあります。

さらに複雑な解決法がありますが、これは単純なものです。

+0

美しい答え私はそれを試してみます –

関連する問題