l--*_*''' 6 c# sql database asp.net sql-server-2008
我想知道执行以下操作的标准/最佳方式是什么:
我在asp.net中有一个表单Web应用程序并使用C#
用户将数据输入表单并单击INSERT,它将数据插入4个不同的表中.
这些领域是:
primarykey, animal, street, country
Run Code Online (Sandbox Code Playgroud)
该表格允许多个动物,多个街道和每个主键的多个国家/地区.所以,当我有这样的数据:
[1],[rhino,cat,dog],[luigi st, paul st], [russia,israel]
Run Code Online (Sandbox Code Playgroud)
我需要将它插入到这样的表中:
table1:
1,rhino
1,cat
1,dog
table2:
1,luigi st
1, paul st
table3:
1,russia
1,israel
Run Code Online (Sandbox Code Playgroud)
问题
我完全不知道如何做到这一点.如果我只有一个表和每个主键一组数据我会使用InsertQuery并以这种方式做,但因为它是多个表我不知道如何做到这一点?
我应该使用哪些控件来允许用户输入多个值?目前我只是使用文本框并考虑用半冒号分隔条目,但这可能不是正确的方法.
我想建议您利用 SQL 2008 中新的多行插入语句,这样您就可以传递如下的 sql 语句:
INSERT INTO table1(id,animal_name) values (1,cat),(1,dog),(1,horse)...
Run Code Online (Sandbox Code Playgroud)
对于您的 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();
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您熟悉存储过程,则与之前的建议相同,但让存储过程接收 DataTable t 作为参数。
如果以上方法都不适合您,请从 Connection 对象创建一个 SqlTranscation,并迭代每个数据集的每一行,将记录插入到相应的表中,最后提交事务。例子在这里。
| 归档时间: |
|
| 查看次数: |
3900 次 |
| 最近记录: |