使用 Web 表单将数据插入到多个表中

Posted

技术标签:

【中文标题】使用 Web 表单将数据插入到多个表中【英文标题】:inserting data into multiple tables using a web form 【发布时间】:2011-09-02 19:05:44 【问题描述】:

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

我在 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

问题

    我完全不知道如何做到这一点。如果我每个主键只有一个表和一组数据,我只会使用 InsertQuery 并这样做,但由于它是多个表,我不知道该怎么做??

    我应该使用什么控件来允许用户输入多个值?目前我只是使用文本框并考虑用分号分隔条目,但这可能不是正确的方法。

【问题讨论】:

对于 (1):您可以使用事务。看到这个答案:***.com/questions/2044467/… 【参考方案1】:

我想建议您利用 SQL 2008 中新的多行插入语句,这样您就可以像这样传递一个 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();

Read more here.

或者,如果您熟悉存储过程,则与之前的建议相同,但让存储过程接收 DataTable t 作为参数。

如果上述方法都不适合您,请从 Connection 对象创建一个 SqlTranscation 并遍历每个数据集的每一行,将记录插入相应的表中,最后提交事务。 Example here.

【讨论】:

非常感谢我将代码放在哪里?在 INSERTING 事件中?【参考方案2】:

在前端使用复选框。有一个服务/存储库来保存用户数据。类似于以下内容:

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();
            
        
    

有更复杂的解决方案,但这是一个简单的解决方案。

【讨论】:

漂亮的答案我会试试的

以上是关于使用 Web 表单将数据插入到多个表中的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历一组动态表单输入并将它们插入到多个表中?

Django - 如何使用 JQuery Ajax 插入多个表单数据

如何使用 SSIS 将多个表中的数据插入到多个表中?

如何使用 django orm 将数据插入到多个表中

将多个表中的数据插入到一个表中

使用 CodeIgniter 框架将数据插入到具有外键的多个表中