如何获取每个数组项并插入 SQL 数据库?
Posted
技术标签:
【中文标题】如何获取每个数组项并插入 SQL 数据库?【英文标题】:How can I take each array item and insert in a SQL database? 【发布时间】:2009-02-18 09:47:38 【问题描述】:我有以下 vb.net 代码从网页上的文本框中取出值(实际上是空格分隔的标签),并用空格分隔符将它们拆分成一个数组。这正是我想要的。
mySample.Tags = tagsTextBox.Text
Dim tags As String = mySample.Tags
Dim tagarray() As String
Dim count As Integer
tagarray = tags.Split(" ")
For count = 0 To tagarray.Length - 1
Next
我的问题是我不知道如何获取数组中的每个值,在此代码运行后,将它们作为单独的记录插入到表中。
我也不知道数组中有多少项。
【问题讨论】:
【参考方案1】:正如 Ian 所说,这可能对 Sql 注入很不利。至少你应该为你想要插入的每个标签做一个 Server.htmlEncode()。
要插入数据,您可以执行以下操作:
using (SqlConncetion conn = new SqlConnection(connstring))
using (SqlCommand cmd = conn.CreateCommand())
cmd.CommandText = "INSERT INTO table(tag) values (@tag)";
cmd.Parameters.Add("@tag", SqlDbType.VarChar);
conn.Open();
foreach(string tag in tags)
cmd.Parameters["@tag"].Value = Server.HtmlEncode(tag);
cmd.ExecuteNonQuery();
这应该可以正常工作,但是在存储过程中进行,并且由于您使用参数,因此您应该可以安全地防止 sql 注入。
您还应该看到here 讨论有关参数使用的讨论。
【讨论】:
这种方法的问题是它的往返中心经常需要一个临时表。它可能非常脆弱。一旦你考虑到这一点,通常传递一个列表是一个更好的选择。 视情况而定可能完全没问题 @ck 它只是设置了一个 prams 值来处理注入的东西,这里真的不需要 htmlencode HtmlEncode 不会阻止 sql 注入,但它会阻止许多其他攻击,例如跨站点脚本攻击。使用参数将停止任何 sql 注入。 但我同意 sambo99 在数据库中这样做是最好的选择【参考方案2】:这完全取决于性能要求和您使用的一般做法。 Rune 的回答可以很好。如果您要插入 100,000 行,请查看批量插入器。
如果你习惯于编写存储过程并且你有幸运行 SQL 2008,你可以使用table valued params
这允许你做这样的事情:
SqlCommand cmd = new SqlCommand("usp_ins_Portfolio", conn);
cmd.CommandType = CommandType.StoredProcedure;
//add the ds here as a tvp
SqlParameter sp = cmd.Parameters.AddWithValue("@Portfolio", ds.Tables[0]);
//notice structured
sp.SqlDbType = SqlDbType.Structured;
cmd.ExecuteNonQuery();
然后对存储过程的一次调用可以将所有需要的行插入到 Tag 表中。
对于 SQL 2005 及以下版本,我通常会为所有值使用单个逗号分隔的参数,并将其拆分到存储过程中的 TSQL 中。这往往表现得非常好,并避免与临时表混在一起。它也是安全的,但是您必须确保为 proc 使用文本输入参数,或者在代码中具有某种限制或批处理机制(因此您不会截断长列表)。
有关如何在 TSQL 中拆分列表的想法,请查看 Erland 的 excellent article。
Sql 2000 版本的article is here。
【讨论】:
以上是关于如何获取每个数组项并插入 SQL 数据库?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 sql group by 选择前 2 项并对一个字段求和?