如何获取每个数组项并插入 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语句

如何获取数组的每个元素? [关闭]

C# Unity如何只选择数组中的一项并取消选择其他项

如何使用 sql group by 选择前 2 项并对一个字段求​​和?

用sql语句如何获取当前时间,如何通过写sql语句改变数据库中的值如何通过写sql语句把数据从数据中提取出来

插入记录后如何从 SQL 服务器获取标识值