如何获取每个数组项并插入SQL数据库?

时间:2009-02-18 09:47:39

标签: sql vb.net arrays

我有以下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

我的问题是,在运行此代码后,我不知道如何获取数组中的每个值,以将它们作为单独的记录插入表中。

我也不知道数组中有多少项。

2 个答案:

答案 0 :(得分:1)

正如伊恩所说,对于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有关参数使用的讨论。

答案 1 :(得分:0)

这完全取决于性能要求和您使用的一般做法。符文的答案可以很好。如果要插入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

article is here的Sql 2000版本。