簡體   English   中英

使用Web表單將數據插入多個表

[英]inserting data into multiple tables using a web form

我想知道執行以下操作的標准/最佳方式是什么:

我在asp.net中有一個表單Web應用程序並使用C#

用戶將數據輸入表單並單擊INSERT,它將數據插入4個不同的表中。

這些領域是:

primarykey, animal, street, country

該表格允許多個動物,多個街道和每個主鍵的多個國家/地區。 所以,當我有這樣的數據:

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

我需要將它插入到這樣的表中:

table1:
1,rhino
1,cat
1,dog

table2:
1,luigi st
1, paul st

table3:
1,russia
1,israel

問題

  1. 我完全不知道如何做到這一點。 如果我只有一個表和每個主鍵一組數據我只會使用InsertQuery並以這種方式做,但因為它是多個表我不知道如何做到這一點?

  2. 我應該使用哪些控件來允許用戶輸入多個值? 目前我只是使用文本框並考慮用半冒號分隔條目,但這可能不是正確的方法。

我想建議你利用SQL 2008中新的multirow insert語句,這樣你就可以像這樣傳遞一個sql語句:

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

對於你的SqlCommand但我不知道如何構建一個這樣的語句,而不會冒成SQL注入攻擊的受害者。

另一種方法是在sql數據庫中定義數據表類型: 在此輸入圖像描述

在此輸入圖像描述

然后在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();
}

在這里閱讀更多

或者,如果您熟悉存儲過程,與先前的建議相同,但使存儲過程接收DataTable作為參數。

如果以上都不適合您,請從Connection對象創建一個SqlTranscation,並遍歷每個數據集的每一行,在相應的表中插入記錄,最后提交事務。 這里的例子。

使用前端的復選框。 有一個服務/存儲庫來保存用戶數據。 類似於以下內容:

public void UpdateUserAnimals(Guid userId, string[] animals)
{
    using (SqlConnection conn = new SqlConnection("connectionstring..."))
    {
        using (SqlCommand cmd = new SqlCommand("Insert Into UserAnimals(UserId, Animals) values (@UserId, @Animal)"))
        {
            conn.Open();
            cmd.Parameters.AddWithValue("@UserId", userId);
            foreach(string animal in animals)
            {
                cmd.Parameters.AddWithValue("@Animal", animal);
                cmd.ExecuteNonQuery();
            }
        }
    }
}

有更復雜的解決方案,但這很簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM